在现代互联网应用中,聊天室是一个经典的实时通信场景。Go 语言凭借其 高并发 和 简洁语法,非常适合开发实时网络应用。本文将带你从零实现一个轻量级在线聊天室,支持多人消息广播。
一、项目目标
-
- 使用 WebSocket 实现实时通信。
-
- 客户端连接后,可以发送和接收消息。
-
- 服务端负责广播消息给所有在线用户。
-
- 提供简单的 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>
五、运行效果
-
-
启动服务端:
go run main.go
-
-
- 浏览器打开 http://localhost:8080。
-
- 打开多个浏览器窗口,输入消息即可实时显示在所有窗口中。
六、功能扩展
-
- 用户昵称 :为每个用户分配昵称,显示
昵称: 消息
。
- 用户昵称 :为每个用户分配昵称,显示
-
- 消息持久化:将聊天记录存储到数据库或文件中。
-
- 群聊/私聊:支持不同的房间或用户之间的私聊。
-
- Web UI 优化:使用 Vue/React 等框架美化界面。
七、总结
本文实现了一个轻量级的在线聊天室,利用 Go 的并发特性和 WebSocket 协议,完成了多人实时通信。通过本项目,你可以快速理解 WebSocket 工作原理 和 Go 高并发处理模型,为后续开发更复杂的实时应用打下基础。