登录
首页 >  Golang >  Go教程

Golang实现WebSocket通信详解

时间:2025-11-04 09:32:29 493浏览 收藏

最近发现不少小伙伴都对Golang很感兴趣,所以今天继续给大家介绍Golang相关的知识,本文《Golang实现WebSocket通信教程》主要内容涉及到等等知识点,希望能帮到你!当然如果阅读本文时存在不同想法,可以在评论中表达,但是请勿使用过激的措辞~

如何使用Golang进行WebSocket通信

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,适用于实时数据传输场景,比如聊天应用、实时通知等。Golang 通过第三方库 gorilla/websocket 提供了对 WebSocket 的良好支持。下面介绍如何使用 Golang 实现 WebSocket 通信。

1. 安装 gorilla/websocket 库

在项目中引入 gorilla/websocket:

go get github.com/gorilla/websocket

这是目前最常用的 Go WebSocket 实现库,功能稳定且文档完善。

2. 创建 WebSocket 服务端

以下是一个简单的 WebSocket 服务端示例,监听客户端连接并回显收到的消息:

package main
<p>import (
"log"
"net/http"
"github.com/gorilla/websocket"
)</p><p>var upgrader = websocket.Upgrader{
CheckOrigin: func(r *http.Request) bool {
return true // 允许跨域连接
},
}</p><p>func handleWebSocket(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Println("升级失败:", err)
return
}
defer conn.Close()</p><pre class="brush:php;toolbar:false;">for {
    messageType, message, err := conn.ReadMessage()
    if err != nil {
        log.Println("读取消息失败:", err)
        break
    }

    log.Printf("收到消息: %s", message)
    // 回显消息给客户端
    if err := conn.WriteMessage(messageType, message); err != nil {
        log.Println("发送消息失败:", err)
        break
    }
}

}

func main() { http.HandleFunc("/ws", handleWebSocket) log.Println("服务器启动在 :8080") log.Fatal(http.ListenAndServe(":8080", nil)) }

说明:

  • upgrader 用于将 HTTP 连接升级为 WebSocket 连接。
  • CheckOrigin 设为 true 是为了允许前端跨域连接,生产环境应根据需要限制来源。
  • conn.ReadMessage() 阻塞等待客户端消息。
  • WriteMessage 将消息原样返回。

3. 编写客户端测试(可用浏览器或命令行)

你可以使用 JavaScript 在浏览器中测试:

<script>
const ws = new WebSocket("ws://localhost:8080/ws");
<p>ws.onopen = function() {
console.log("连接已建立");
ws.send("你好,Go 服务器!");
};</p><p>ws.onmessage = function(event) {
console.log("收到消息:", event.data);
};
</script></p>

也可以使用命令行工具如 wscat 测试:

wscat -c ws://localhost:8080/ws

4. 实现广播机制(多人聊天示例)

如果想让一个消息发送给所有连接的客户端,可以维护一个客户端集合:

var clients = make(map[*websocket.Conn]bool)
var broadcast = make(chan []byte)
<p>func handleWebSocket(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Println(err)
return
}
defer conn.Close()</p><pre class="brush:php;toolbar:false;">clients[conn] = true

for {
    _, message, err := conn.ReadMessage()
    if err != nil {
        delete(clients, conn)
        break
    }
    broadcast <- message
}

}

// 广播协程 func broadcastMessages() { for { msg := <-broadcast for client := range clients { err := client.WriteMessage(websocket.TextMessage, msg) if err != nil { client.Close() delete(clients, client) } } } }

在 main 函数中启动广播协程:

go broadcastMessages()

这样任意客户端发送的消息都会被转发给所有在线用户。

基本上就这些。使用 gorilla/websocket 能快速搭建可靠的 WebSocket 服务,结合 Go 的并发优势,适合构建高并发实时应用。

好了,本文到此结束,带大家了解了《Golang实现WebSocket通信详解》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

相关阅读
更多>
最新阅读
更多>
课程推荐
更多>