在现代互联网应用中,聊天室是一个经典的实时通信场景。Go 语言凭借其 高并发 和 简洁语法,非常适合开发实时网络应用。本文将带你从零实现一个轻量级在线聊天室,支持多人消息广播。
一、项目目标
- 1. 使用 WebSocket 实现实时通信。
- 2. 客户端连接后,可以发送和接收消息。
- 3. 服务端负责广播消息给所有在线用户。
- 4. 提供简单的 Web 前端页面作为聊天室入口。
二、技术选型
- • 后端:Go +
gorilla/websocket(WebSocket 库) - • 前端:HTML + JavaScript(原生 WebSocket API)
- • 运行环境:只需一个 Go 程序和浏览器
三、后端实现
1. 安装依赖
go get github.com/gorilla/websocket
2. Go 服务端代码
package main import ( "fmt" "log" "net/http" "github.com/gorilla/websocket" ) // 升级器:将 HTTP 协议升级为 WebSocket var upgrader = websocket.Upgrader{ CheckOrigin: func(r *http.Request) bool { return true // 允许跨域 }, } // 全局客户端集合 var clients = make(map[*websocket.Conn]bool) // 广播通道 var broadcast = make(chan string) // 处理 WebSocket 连接 func handleConnections(w http.ResponseWriter, r *http.Request) { ws, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Fatal(err) } defer ws.Close() // 新客户端加入 clients[ws] = true for { var msg string err := ws.ReadJSON(&msg) if err != nil { delete(clients, ws) break } // 将消息发送到广播通道 broadcast <- msg } } // 处理广播 func handleMessages() { for { // 等待新消息 msg := <-broadcast // 将消息发送给所有客户端 for client := range clients { err := client.WriteJSON(msg) if err != nil { client.Close() delete(clients, client) } } } } func main() { fs := http.FileServer(http.Dir("./static")) http.Handle("/", fs) http.HandleFunc("/ws", handleConnections) go handleMessages() fmt.Println("聊天室服务已启动:http://localhost:8080") err := http.ListenAndServe(":8080", nil) if err != nil { log.Fatal("启动失败:", err) } }
四、前端实现
新建 static/index.html:
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <title>Go聊天室</title> <style> body { font-family: Arial; margin: 20px; } #chat { width: 400px; height: 300px; border: 1px solid #ccc; overflow-y: auto; padding: 10px; } #msg { width: 300px; } </style> </head> <body> <h2>Go 在线聊天室</h2> <div id="chat"></div> <input type="text" id="msg" placeholder="输入消息..." /> <button onclick="sendMessage()">发送</button> <script> const ws = new WebSocket("ws://localhost:8080/ws"); const chat = document.getElementById("chat"); const msgInput = document.getElementById("msg"); ws.onmessage = function(event) { const p = document.createElement("p"); p.innerText = event.data; chat.appendChild(p); chat.scrollTop = chat.scrollHeight; }; function sendMessage() { const msg = msgInput.value; ws.send(JSON.stringify(msg)); msgInput.value = ""; } </script> </body> </html>
五、运行效果
- 1. 启动服务端:
go run main.go
- 2. 浏览器打开 http://localhost:8080。
- 3. 打开多个浏览器窗口,输入消息即可实时显示在所有窗口中。
六、功能扩展
- 1. 用户昵称:为每个用户分配昵称,显示
昵称: 消息。 - 2. 消息持久化:将聊天记录存储到数据库或文件中。
- 3. 群聊/私聊:支持不同的房间或用户之间的私聊。
- 4. Web UI 优化:使用 Vue/React 等框架美化界面。
七、总结
本文实现了一个轻量级的在线聊天室,利用 Go 的并发特性和 WebSocket 协议,完成了多人实时通信。通过本项目,你可以快速理解 WebSocket 工作原理 和 Go 高并发处理模型,为后续开发更复杂的实时应用打下基础。