集成WebSocket

WebSocket是一种基于HTTP扩展的支持全双工通信的应用层协议,适用于实时通讯、网络游戏等场景。Gin框架本身未提供WebSocket相关的支持,但我们可以很容易的将gorilla/websocket集成到Gin中。Gorilla是一个流行的Go语言Web工具包,其中提供了多种功能强大的模块,gorilla/websocket便是其中之一。这篇笔记我们介绍如何基于Gin开发WebSocket服务。

安装依赖

执行以下命令安装gorilla/websocket包。

go get -u github.com/gorilla/websocket

实现WebSocket例子

这里我们直接编写一个简单的例子,代码中我们创建了一个WebSocket服务,它会向客户端echo输入的内容,当输入的内容为exit时则关闭连接。

package main

import (
    "fmt"
    "github.com/gin-gonic/gin"
    "github.com/gorilla/websocket"
    "net/http"
)

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 {
        fmt.Println(err.Error())
        return
    }
    defer func() {
        err := conn.Close()
        if err != nil {
            fmt.Println(err.Error())
            return
        }
    }()
    for {
        _, p, err := conn.ReadMessage()
        if err != nil {
            fmt.Println(err.Error())
            return
        }
        pStr := string(p)
        if pStr == "exit" {
            break
        } else {
            println("Received: ", string(p))
            err = conn.WriteMessage(websocket.TextMessage, p)
            if err != nil {
                fmt.Println(err.Error())
                return
            }
        }
    }
}

func main() {
    engine := gin.Default()
    engine.GET("/ws", func(context *gin.Context) {
        wsHandler(context.Writer, context.Request)
    })
    err := engine.Run(":8080")
    if err != nil {
        fmt.Println(err)
        return
    }
}

代码中,upgrader用于配置WebSocket连接的参数。main()函数中,我们在/ws路径上注册了WebSocket相关的处理函数,它调用gorilla/websocket来将连接“升级”为WebSocket连接。wsHandler()中的代码逻辑十分简单,我们编写了一个循环,当接收到消息时,我们将其打印出来,然后将其原样发送回客户端。当接收到消息为exit时,我们退出循环。

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。
Copyright © 2017-2024 Gacfox All Rights Reserved.
Build with NextJS | Sitemap