golang 中如何实现 WebSocket 通信

WebSocket 提供了一种全双工通信的机制,通过一个初始的 HTTP 握手连接,之后升级为 WebSocket 连接,从而实现低延迟的双向通信。Golang 通过其强大的并发模型和简洁的语法,为 WebSocket 通信提供了便捷的支持。本文将深入探讨在 Golang 中实现 WebSocket 通信的背景、常见实现方法、实践案例,并最后进行总结。

用 Apifox,节省研发团队的每一分钟

golang 中如何实现 WebSocket 通信

免费使用 Apifox

相关推荐

最新文章

API

一体化协作平台

API 设计

API 文档

API 调试

自动化测试

API Mock

API Hub

立即体验 Apifox
目录

WebSocket 提供了一种全双工通信的机制,通过一个初始的 HTTP 握手连接,之后升级为 WebSocket 连接,从而实现低延迟的双向通信。Golang 通过其强大的并发模型和简洁的语法,为 WebSocket 通信提供了便捷的支持。本文将深入探讨在 Golang 中实现 WebSocket 通信的背景、常见实现方法、实践案例,并最后进行总结。

WebSocket 调试工具

要调试 WebSocket,那就需要一个好的调试工具,这里我比较推荐 Apifox。它支持调试 http(s)、WebSocket、Socket、gRPC、Dubbo 等多种协议的接口,这使得它成为了一个非常全面的接口测试工具!

WebSocket 调试工具

常见实现方法

gorilla/websocket 包

gorilla/websocket 是 Golang 中用于处理 WebSocket 的一个流行包。通过简单的 API,可以轻松地实现 WebSocket 通信。以下是一个简单的示例:

package main

import (
    "net/http"
    "github.com/gorilla/websocket"
)

var upgrader = websocket.Upgrader{
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,
}

func handler(w http.ResponseWriter, r *http.Request) {
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        return
    }
    defer conn.Close()

    for {
        messageType, p, err := conn.ReadMessage()
        if err != nil {
            return
        }
        if err := conn.WriteMessage(messageType, p); err != nil {
            return
        }
    }
}

func main() {
    http.HandleFunc("/", handler)
    http.ListenAndServe(":8080", nil)
}

gin 框架中的 WebSocket


gin 是一个流行的 Golang Web 框架,它内置了 WebSocket 支持。以下是一个简单的示例:

package main

import (
    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()

    r.GET("/", func(c *gin.Context) {
        c.HTML(200, "index.html", nil)
    })

    r.GET("/ws", func(c *gin.Context) {
        // 处理WebSocket连接
        // ...
    })

    r.Run(":8080")
}

gorilla/mux 路由器


gorilla/mux 是 Golang 中的另一个强大的路由器,也可以用于处理 WebSocket 请求。以下是一个简单的示例:

package main

import (
    "log"
    "net/http"
    "github.com/gorilla/mux"
    "github.com/gorilla/websocket"
)

var upgrader = websocket.Upgrader{
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,
}

func wsHandler(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, p, err := conn.ReadMessage()
        if err != nil {
            return
        }
        if err := conn.WriteMessage(messageType, p); err != nil {
            return
        }
    }
}

func main() {
    r := mux.NewRouter()
    r.HandleFunc("/ws", wsHandler)

    http.Handle("/", r)
    http.ListenAndServe(":8080", nil)
}

实践案例

在本实践案例中,我们将通过一个简单的 Golang WebSocket 聊天应用程序,逐步演示如何实现 WebSocket 通信。这将包括项目初始化、依赖安装、服务器端的实现。

1. 创建项目结构

首先,创建一个新的目录以存储项目文件:

mkdir golang-websocket-chat
cd golang-websocket-chat

2. 初始化 Go 模块

在项目目录中运行以下命令初始化 Go 模块:

go mod init golang-websocket-chat

3. 安装依赖

使用以下命令安装gorilla/websocket

go get github.com/gorilla/websocket
💡
如果提示超时(timeout),你需要用这个命令指定一下服务地址:go env -w GOPROXY=https://goproxy.cn

4. 服务器端实现创建主文件 main.go 并添加以下内容:

package main

import (
    "log"
    "net/http"

    "github.com/gorilla/websocket"
)

var upgrader = websocket.Upgrader{
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,
}

func wsHandler(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, p, err := conn.ReadMessage()
        if err != nil {
            log.Println(err)
            return
        }

        // 输出客户端发送的消息到控制台
        log.Printf("Received message: %s\n", p)

        if err := conn.WriteMessage(messageType, p); err != nil {
            log.Println(err)
            return
        }
    }
}

func main() {
    http.HandleFunc("/", wsHandler)

    log.Println("Server is running on :3000...")
    http.ListenAndServe(":3000", nil)
}

5. 运行应用程序在项目根目录下运行以下命令启动服务器:

go run main.go

6.使用 Apifox 调试 WebSocket

如果你要调试 WebSocket 接口,并确保你的应用程序能够正常工作。这时,一个强大的接口测试工具就会派上用场。


Apifox 是一个比 Postman 更强大的接口测试工具,Apifox = Postman + Swagger + Mock + JMeter。它支持调试 http(s)、WebSocket、Socket、gRPC、Dubbo 等多种协议的接口,这使得它成为了一个非常全面的接口测试工具,所以强烈推荐去下载体验


上面的实践案例的调试方法如下所示,首先在 Apifox 中新建一个 HTTP 项目,然后在项目中添加 WebSocket 接口。

Apifox 中添加 WebSocket 接口
Apifox 中添加 WebSocket 接口


接着输入 WebSocket 的服务端 URL,例如:ws://localhost:3000,然后保存并填写接口名称,然后确定即可。

Apifox 输入 WebSocket 的服务端 URL
Apifox 输入 WebSocket 的服务端 URL

点击“Message”选项,然后写入“你好啊,我是 Apifox”,然后点击发送,你会看到服务端和其它客户端都接收到了信息,非常方便,快去试试吧

Apifox 调试 WebSocket 发送消息
Apifox 调试 WebSocket 发送消息

总结

通过本文的介绍,我们深入了解了在 Golang 中实现 WebSocket 通信的背景、常见实现方法,并通过一个简单的聊天室案例进行了实践。WebSocket 提供了一种有效的实时通信方式,而 Golang 通过其强大的并发模型和丰富的第三方库支持,使得 WebSocket 在 Golang 中的应用变得轻松而强大。

参考链接

学习更多: