登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  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

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.Println("升级失败:", err) return } defer conn.Close()

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 在浏览器中测试:

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

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

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

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

var clients = make(map[*websocket.Conn]bool)
var broadcast = make(chan []byte)

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()

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知识!

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