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

相关内容

热门资讯

透视透视(微扑克)wpk提高胜... 透视透视(微扑克)wpk提高胜率(透视)详细辅助可靠技巧(果然存在有挂)1、许多玩家不知道wpk提高...
微扑克ai辅助器苹果版!wpk... 微扑克ai辅助器苹果版!wpk微扑克真的有助辅吗,(wePOke)都是存在有挂(详细透视黑科技教程)...
aapoker透视辅助!aap... aapoker透视辅助!aapoker在哪里下载,(AAPOKer)果然真的有挂(详细辅助2025新...
透视安卓版(Wpk)微扑克辅助... 透视安卓版(Wpk)微扑克辅助机器人(透视)详细辅助扑克教程(都是真的是有挂)微扑克辅助机器人辅助器...
aapoker辅助工具!微扑克... aapoker辅助工具!微扑克插件,(AAPOker)切实是有挂(详细透视微扑克教程);aapoke...
aapoker外挂!aapok... aapoker外挂!aapoker外挂教程,(AAPOker)真是是真的有挂(详细辅助透明挂教程)1...
透视有挂(wpK)wpk真的有... 透视有挂(wpK)wpk真的有外挂(透视)详细辅助德州教程(果然是有挂)wpk真的有外挂辅助器中分为...
aapoker发牌机制!wep... aapoker发牌机制!wepoke有规律吗,(wepOke)果然是真的有挂(详细透视曝光教程)1、...
aapoker俱乐部!aapo... aapoker俱乐部!aapoker有网页版吗,(德州aapoker俱乐部)确实是真的有挂(详细辅助...
透视规律(wpK)微扑克游戏辅... 透视规律(wpK)微扑克游戏辅助器(透视)详细辅助插件教程(都是存在有挂);进入游戏-大厅左侧-新手...