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 		} 	} } 

相关内容

热门资讯

关于!wepoker透视器免费... 关于!wepoker透视器免费“透明挂开挂透视挂辅助工具”;wepoker透视器免费是一项wepok...
新手必备!德州真人透视脚本“普... 新手必备!德州真人透视脚本“普及开挂透视挂辅助插件”;AI辅助机器人普及解说快速成为一个“必胜”的a...
玩家必看教程!wejoker辅... 您好,wejoker辅助软件这款游戏可以开挂的,确实是有挂的,需要了解加微【136704302】很多...
玩家必看科普!we-poker... 您好,we-poker靠谱这款游戏可以开挂的,确实是有挂的,需要了解加微【136704302】很多玩...
终于懂了!hhpoker可以防... 终于懂了!hhpoker可以防透视挂“总结开挂透视挂辅助下载”;致您一封信;亲爱hhpoker可以防...
盘点几款!wepoker透视是... 【福星临门,好运相随】;盘点几款!wepoker透视是真的“黑科技开挂透视挂辅助挂”;暗藏猫腻,小编...
发现一款!wpk辅助器是真的“... 发现一款!wpk辅助器是真的“揭秘开挂透视挂辅助软件”;wpk辅助器是真的是一项wpk辅助器是真的软...
普及知识!wepoker公共底... 您好,wepoker公共底牌这款游戏可以开挂的,确实是有挂的,需要了解加微【136704302】很多...
科技新动态!哈糖大菠萝有挂“解... 您好,哈糖大菠萝有挂这款游戏可以开挂的,确实是有挂的,需要了解加微【136704302】很多玩家在这...
查到实测辅助!hhpoker俱... 您好:hhpoker俱乐部是干嘛的这款游戏可以开挂的,确实是有挂的,很多玩家在这款游戏中打牌都会发现...