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、该软件可以轻松地帮...
曝光透视!hhpoker作弊实... 曝光透视!hhpoker作弊实战视频!推荐一款辅助攻略(有挂技术)-哔哩哔哩1、曝光透视!hhpok...
据报道!阿当比鸡有透视吗,榆林... 据报道!阿当比鸡有透视吗,榆林打锅子辅助器,绝活教程(有挂教学)-哔哩哔哩1、上手简单,内置详细流程...
教你透视!德州局脚本!一分钟快... 教你透视!德州局脚本!一分钟快速了解辅助app(有挂方略)-哔哩哔哩1、让任何用户在无需德州局脚本安...
有挂透视!wepoker辅助是... 有挂透视!wepoker辅助是真的假的!热点推荐辅助挂(有挂辅助)-哔哩哔哩一、wepoker辅助是...
据玩家消息!微信青龙区免费辅助... 据玩家消息!微信青龙区免费辅助,边锋老友威海荣成辅助,窍要教程(有挂实锤)-哔哩哔哩1、打开软件启动...
迎来新发展!好友赣南辅助是真的... 迎来新发展!好友赣南辅助是真的吗,四川家园游戏辅助,积累教程(有挂细节)-哔哩哔哩1、不需要AI权限...
了解透视!wepoker有没有... 了解透视!wepoker有没有插件!记者揭秘辅助攻略(揭秘有挂)-哔哩哔哩1)wepoker有没有插...
反观!威信茶馆大贰破解,微乐福... 反观!威信茶馆大贰破解,微乐福建辅助器,方式教程(有挂技巧)-哔哩哔哩;1)威信茶馆大贰破解辅助插件...
必备透视!红龙poker辅助器... 必备透视!红龙poker辅助器免费观看!揭秘几款辅助挂(有挂攻略)-哔哩哔哩1、全新机制【红龙pok...