您的位置:首页 >Golang实现简单聊天室_WebSocket实时通信教程
发布于2025-12-12 阅读(0)
扫一扫,手机访问
使用gorilla/websocket库搭建WebSocket服务器,通过Upgrade将HTTP连接升级为WebSocket连接,实现客户端与服务端的双向通信。2. 定义全局clients map和broadcast通道,利用协程监听广播消息并推送给所有活跃连接,实现消息的实时群发。

用Golang实现一个简单聊天室,核心是利用WebSocket建立客户端与服务端的长连接,实现消息的实时双向通信。下面一步步带你完成一个基础但完整的聊天室demo。
Go标准库没有内置WebSocket支持,需借助第三方库,推荐使用 gorilla/websocket,安装方式:
go get github.com/gorilla/websocket创建主服务文件 main.go,初始化路由和WebSocket处理函数:
package mainimport ( "log" "net/http" "github.com/gorilla/websocket" )
var upgrader = websocket.Upgrader{ CheckOrigin: func(r *http.Request) bool { return true // 允许跨域 }, }
func handleConnections(w http.ResponseWriter, r *http.Request) { // 升级HTTP连接为WebSocket ws, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Fatal(err) return } defer ws.Close()
// 新用户加入后,持续监听消息 for { var msg string err := ws.ReadJSON(&msg) if err != nil { log.Printf("读取消息失败: %v", err) break } // 广播消息给所有客户端(后续实现) broadcastMessage(msg, ws) }}
func main() { http.HandleFunc("/ws", handleConnections) http.Handle("/", http.FileServer(http.Dir("./public"))) log.Println("服务器运行在 :8080") log.Fatal(http.ListenAndServe(":8080", nil)) }
需要一个全局结构来保存所有活跃的WebSocket连接,以便广播消息。
定义 clients map 和广播通道:
var (
clients = make(map[*websocket.Conn]bool) // 所有连接
broadcast = make(chan string) // 广播消息通道
)
启动一个后台协程,监听广播通道并推送消息给每个客户端:
func handleMessages() {
for {
msg := <-broadcast
for client := range clients {
err := client.WriteJSON(msg)
if err != nil {
log.Printf("发送消息失败: %v", err)
client.Close()
delete(clients, client)
}
}
}
}
在 main 函数中启动该协程:
go handleMessages()修改 handleConnections,在连接建立时注册客户端:
clients[ws] = true
当某个客户端发来消息,将其推入 broadcast 通道:
func broadcastMessage(msg string, sender *websocket.Conn) {
broadcast <- msg
}
这样 handleMessages 协程会自动将消息发送给所有在线用户。
在项目目录下创建 public/index.html:
<!DOCTYPE html> <html> <head> <title>Go 聊天室</title> </head> <body> <h2>聊天室</h2> <div id="chat"></div> <input type="text" id="msg" placeholder="输入消息" /> <button onclick="send()">发送</button><script> const ws = new WebSocket("ws://localhost:8080/ws"); const chatBox = document.getElementById("chat"); const input = document.getElementById("msg");
ws.onmessage = function(event) { const div = document.createElement("div"); div.textContent = event.data; chatBox.appendChild(div); }; function send() { if (input.value) { ws.send(input.value); input.value = ""; } }</script> </body> </html>
打开多个浏览器窗口访问 http://localhost:8080,即可看到实时聊天效果。
基本上就这些。这个例子展示了如何用Golang + WebSocket实现最简聊天室。你可以在此基础上扩展:支持用户名、私聊、房间分组、消息持久化等。关键是理解连接管理与广播机制的配合。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9