Golang WebSocket服务器实现
我正在尝试用Golang实现一个WebSocket服务器,但在处理客户端连接时遇到了问题。具体表现是当多个客户端同时连接时,服务器会出现消息混乱的情况。请问应该如何正确管理多个WebSocket连接?需要用到goroutine和channel吗?另外,在实现心跳检测和断线重连机制时有哪些最佳实践?能否分享一个完整的示例代码?
2 回复
使用Golang实现WebSocket服务器:
- 导入
gorilla/websocket库 - 创建HTTP服务器并升级连接
- 处理消息收发
- 管理连接池
示例代码:
var upgrader = websocket.Upgrader{}
var clients = make(map[*websocket.Conn]bool)
func handleConnections(w http.ResponseWriter, r *http.Request) {
conn, _ := upgrader.Upgrade(w, r, nil)
clients[conn] = true
for {
_, msg, err := conn.ReadMessage()
if err != nil {
delete(clients, conn)
break
}
// 广播消息
for client := range clients {
client.WriteMessage(websocket.TextMessage, msg)
}
}
}
更多关于Golang WebSocket服务器实现的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Go语言中,可以使用gorilla/websocket库快速实现WebSocket服务器。以下是基本实现步骤和代码示例:
-
安装依赖
go get github.com/gorilla/websocket -
服务器实现代码
package main
import (
"log"
"net/http"
"github.com/gorilla/websocket"
)
var upgrader = websocket.Upgrader{
CheckOrigin: func(r *http.Request) bool {
return true // 生产环境应验证来源
},
}
func handleWebSocket(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Print("升级连接失败:", err)
return
}
defer conn.Close()
for {
messageType, message, err := conn.ReadMessage()
if err != nil {
log.Println("读取消息失败:", err)
break
}
log.Printf("收到: %s", message)
// 回声测试
err = conn.WriteMessage(messageType, message)
if err != nil {
log.Println("写入消息失败:", err)
break
}
}
}
func main() {
http.HandleFunc("/ws", handleWebSocket)
log.Println("服务器启动在 :8080")
log.Fatal(http.ListenAndServe(":8080", nil))
}
- 核心功能说明
upgrader.Upgrade():将HTTP连接升级为WebSocket连接conn.ReadMessage():读取客户端消息conn.WriteMessage():向客户端发送消息- 支持文本和二进制消息类型
- 客户端测试 使用浏览器开发者工具测试:
let ws = new WebSocket("ws://localhost:8080/ws");
ws.onmessage = event => console.log("收到:", event.data);
ws.send("Hello WebSocket!");
- 扩展建议
- 添加连接管理(使用map记录连接)
- 实现广播功能
- 添加身份验证
- 处理跨域配置
这个实现提供了基础的WebSocket通信功能,可根据实际需求扩展更多业务逻辑。

