Golang WebSocket服务器实现

我正在尝试用Golang实现一个WebSocket服务器,但在处理客户端连接时遇到了问题。具体表现是当多个客户端同时连接时,服务器会出现消息混乱的情况。请问应该如何正确管理多个WebSocket连接?需要用到goroutine和channel吗?另外,在实现心跳检测和断线重连机制时有哪些最佳实践?能否分享一个完整的示例代码?

2 回复

使用Golang实现WebSocket服务器:

  1. 导入gorilla/websocket
  2. 创建HTTP服务器并升级连接
  3. 处理消息收发
  4. 管理连接池

示例代码:

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服务器。以下是基本实现步骤和代码示例:

  1. 安装依赖

    go get github.com/gorilla/websocket
    
  2. 服务器实现代码

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))
}
  1. 核心功能说明
  • upgrader.Upgrade():将HTTP连接升级为WebSocket连接
  • conn.ReadMessage():读取客户端消息
  • conn.WriteMessage():向客户端发送消息
  • 支持文本和二进制消息类型
  1. 客户端测试 使用浏览器开发者工具测试:
let ws = new WebSocket("ws://localhost:8080/ws");
ws.onmessage = event => console.log("收到:", event.data);
ws.send("Hello WebSocket!");
  1. 扩展建议
  • 添加连接管理(使用map记录连接)
  • 实现广播功能
  • 添加身份验证
  • 处理跨域配置

这个实现提供了基础的WebSocket通信功能,可根据实际需求扩展更多业务逻辑。

回到顶部