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

相关内容

热门资讯

微乐小程序真的有挂!微乐手游微... 微乐小程序真的有挂!微乐手游微乐辅助免费(开挂)插件-切实解谜是有挂微乐小程序真的有挂!微乐手游微乐...
有消息称!微乐小程序免费黑科技... 有消息称!微乐小程序免费黑科技,微信小程序微乐挂如何获取(作弊器)指引教程(果然存在有挂)在进入软件...
透视揭幕!微乐小程序免费黑科技... 透视揭幕!微乐小程序免费黑科技(外挂),微信小程序微乐辅助器,教程阶段(发现有挂)-哔哩哔哩1、下载...
现有说明如下!微乐小程序黑科技... 现有说明如下!微乐小程序黑科技,微乐家乡官方免费下载安装(作弊器)阶段教程(果然真的有挂)能透视中分...
微乐小程序黑科技免费!微乐家乡... 微乐小程序黑科技免费!微乐家乡官方app下载(开挂)app-一直揭幕真的有挂1、每一步都需要思考,不...
透视辅助!微乐小程序黑科技(外... 透视辅助!微乐小程序黑科技(外挂),微乐小程序辅助免费,教程练习(存在有挂)-哔哩哔哩在进入软件靠谱...
据监测!微乐小程序免费黑科技,... 据监测!微乐小程序免费黑科技,微乐小程序自建房辅助器下载(作弊器)绝活儿教程(确实真的是有挂)1、玩...
微乐小程序存在有挂!微信小程序... 微乐小程序存在有挂!微信小程序 微乐陕西挖坑 外挂(开挂)工具-原来解谜是真的挂1、模拟器是什么优化...
透视揭露!微乐小程序黑科技(外... 透视揭露!微乐小程序黑科技(外挂),微乐小程序免费脚本,教程指引(真的有挂)-哔哩哔哩1、实时透视辅...
相较于以往!微乐小程序免费黑科... 相较于以往!微乐小程序免费黑科技,微信微乐辅助器免费(作弊器)阶段教程(其实是有挂)1、点击下载安装...