Golang 实现 websocket 通讯(一个服务器,两个客户端)
创始人
2025-01-19 09:32:47
0

运行客户端时首先要输入自己的名字,两个客户端输入的名字不能一样。

先上运行结果:

服务器端:

客户端1:

客户端2:

话不多说,直接上代码:

服务器端:

package main  import ( 	"fmt" 	"github.com/gorilla/websocket" 	"log" 	"net/http" )  var upgrader = websocket.Upgrader{ 	CheckOrigin: func(r *http.Request) bool { 		return true 	}, }  // Client represents a connected client type Client struct { 	conn *websocket.Conn }  // Message represents a message from a client type Message struct { 	Sender    string `json:"sender"` 	Recipient string `json:"recipient"` 	Content   string `json:"content"` }  var clients = make(map[*Client]bool) var broadcast = make(chan Message)  func handleConnections(w http.ResponseWriter, r *http.Request) { 	conn, err := upgrader.Upgrade(w, r, nil) 	if err != nil { 		log.Println(err) 		return 	} 	defer conn.Close()  	client := &Client{conn: conn} 	clients[client] = true  	fmt.Println("Client connected")  	for { 		var msg Message 		err := conn.ReadJSON(&msg) 		if err != nil { 			log.Println(err) 			delete(clients, client) 			break 		}  		broadcast <- msg 	} }  func handleMessages() { 	for { 		msg := <-broadcast  		for client := range clients { 			if client.conn != nil { 				err := client.conn.WriteJSON(msg) 				if err != nil { 					log.Println(err) 					client.conn.Close() 					delete(clients, client) 				} 			} 		} 	} }  func main() { 	http.HandleFunc("/", handleConnections) 	go handleMessages()  	fmt.Println("WebSocket server listening on :8080") 	log.Fatal(http.ListenAndServe(":8080", nil)) } 

客户端1:

package main  import ( 	"bufio" 	"fmt" 	"github.com/gorilla/websocket" 	"log" 	"os" )  type Message struct { 	Sender    string `json:"sender"` 	Recipient string `json:"recipient"` 	Content   string `json:"content"` }  func main() { 	conn, _, err := websocket.DefaultDialer.Dial("ws://localhost:8080", nil) 	if err != nil { 		log.Println("Error connecting to server:", err) 		return 	} 	defer conn.Close()  	go func() { 		for { 			var msg Message 			err := conn.ReadJSON(&msg) 			if err != nil { 				log.Println("Error reading message:", err) 				return 			} 			fmt.Printf("Received from %s: %s\n", msg.Sender, msg.Content) 		} 	}()  	fmt.Print("Enter your name: ") 	var name string 	fmt.Scanln(&name)  	scanner := bufio.NewScanner(os.Stdin) 	for scanner.Scan() { 		message := scanner.Text() 		msg := Message{Sender: name, Content: message} 		err := conn.WriteJSON(msg) 		if err != nil { 			log.Println("Error sending message:", err) 			return 		} 	} } 

客户端2:

package main  import ( 	"bufio" 	"fmt" 	"github.com/gorilla/websocket" 	"log" 	"os" )  type Message struct { 	Sender    string `json:"sender"` 	Recipient string `json:"recipient"` 	Content   string `json:"content"` }  func main() { 	conn, _, err := websocket.DefaultDialer.Dial("ws://localhost:8080", nil) 	if err != nil { 		log.Println("Error connecting to server:", err) 		return 	} 	defer conn.Close()  	go func() { 		for { 			var msg Message 			err := conn.ReadJSON(&msg) 			if err != nil { 				log.Println("Error reading message:", err) 				return 			} 			fmt.Printf("Received from %s: %s\n", msg.Sender, msg.Content) 		} 	}()  	fmt.Print("Enter your name: ") 	var name string 	fmt.Scanln(&name)  	scanner := bufio.NewScanner(os.Stdin) 	for scanner.Scan() { 		message := scanner.Text() 		msg := Message{Sender: name, Content: message} 		err := conn.WriteJSON(msg) 		if err != nil { 			log.Println("Error sending message:", err) 			return 		} 	} } 

相关内容

热门资讯

必备攻略!微信微乐游戏辅助器-... 必备攻略!微信微乐游戏辅助器-是真的有外挂(辅助)app(有挂辅助)是一款可以让一直输的玩家,快速成...
揭秘一下!边锋干瞪眼ios辅助... 揭秘一下!边锋干瞪眼ios辅助微信(了解辅助插件)原来有透视手段揭秘一下!边锋干瞪眼ios辅助微信(...
2分钟辅助!pokemomo辅... 2分钟辅助!pokemomo辅助软件,wpk插件,详细教程(真实有挂)1、在pokemomo辅助软件...
一起来探讨!陕西扣点点脚本辅助... 《一起来探讨!陕西扣点点脚本辅助器-是真的有外挂(辅助)下载(有挂讲解)》 陕西扣点点脚本辅助器软件...
必备攻略!乐玩游戏辅助工具(辅... 必备攻略!乐玩游戏辅助工具(辅助辅助器)真是有透视模块1、完成乐玩游戏辅助工具有辅助插件,帮助玩家取...
1分钟辅助!wepoker透视... 1分钟辅助!wepoker透视功能下载,wepoker国外版透视,详细教程(有挂存在)1、很好的工具...
终于知道!789大菠萝攻略-有... 终于知道!789大菠萝攻略-有外挂(辅助)神器(有挂功能);789大菠萝攻略是一种具有地方特色的麻将...
2分钟细说!鸿狐拼十辅助(详情... 2分钟细说!鸿狐拼十辅助(详情辅助神器)竟然有透视教材该软件可以轻松地帮助玩家将鸿狐拼十辅助外卦神器...
第1分钟辅助!hhpoker作... 第1分钟辅助!hhpoker作弊码怎么用,wpk辅助软件,详细教程(有挂教程)1、实时hhpoker...
盘点几款!wepoker怎么买... 您好,wepoker怎么买辅助这款游戏可以开挂的,确实是有挂的,需要了解加微【136704302】很...