如何引入go-socket.io库支持websocket开发?

1. 运行环境

go version go1.18.3 linux/amd64
Ubuntu 20.04.4 LTS

2. 问题描述?

已经完成本课程,想在现有的基础上引入Websocket支持。用Gin原生写ws不好扩展,发现有一个 go-socket.io 就想着拿过来玩一玩。

参考 官方示例 我做了如下修改:

go get github.com/googollee/go-socket.io

新建 app/http/middlewares/cors.go 文件:

package middlewares

import (
    "net/http"
    "gohub/pkg/config"

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

// Recovery 使用 zap.Error() 来记录 Panic 和 call stack
func Cors() gin.HandlerFunc {

    return func(c *gin.Context) {
        defer func() {
            if err := recover(); err != nil {
                c.Writer.Header().Set("Access-Control-Allow-Origin", config.GetString("app.url"))
                c.Writer.Header().Set("Access-Control-Allow-Credentials", "true")
                c.Writer.Header().Set("Access-Control-Allow-Methods", "POST, OPTIONS, GET, PUT, DELETE")
                c.Writer.Header().Set("Access-Control-Allow-Headers", "Accept, Authorization, Content-Type, Content-Length, X-CSRF-Token, Token, session, Origin, Host, Connection, Accept-Encoding, Accept-Language, X-Requested-With")

                if c.Request.Method == http.MethodOptions {
                    c.AbortWithStatus(http.StatusNoContent)
                    return
                }

                c.Request.Header.Del("Origin")
            }
        }()
        c.Next()
    }
}

新建 routes/ws.go 文件:

package routes

import (
    "log"
    "gohub/app/http/middlewares"

    "github.com/gin-gonic/gin"
    socketio "github.com/googollee/go-socket.io"
)

// RegisterWebsocketRoutes 注册 Ws 相关路由
func RegisterWebsocketRoutes(r *gin.Engine) {
    server := socketio.NewServer(nil)

    server.OnConnect("/", func(s socketio.Conn) error {
        s.SetContext("")
        log.Println("connected:", s.ID())
        return nil
    })

    server.OnEvent("/", "notice", func(s socketio.Conn, msg string) {
        log.Println("notice:", msg)
        s.Emit("reply", "have "+msg)
    })

    server.OnEvent("/chat", "msg", func(s socketio.Conn, msg string) string {
        s.SetContext(msg)
        return "recv " + msg
    })

    server.OnEvent("/", "bye", func(s socketio.Conn) string {
        last := s.Context().(string)
        s.Emit("bye", last)
        s.Close()
        return last
    })

    server.OnError("/", func(s socketio.Conn, e error) {
        log.Println("meet error:", e)
    })

    server.OnDisconnect("/", func(s socketio.Conn, msg string) {
        log.Println("closed", msg)
    })

    go func() {
        if err := server.Serve(); err != nil {
            log.Fatalf("socketio listen error: %s\n", err)
        }
    }()
    defer server.Close()

    r.GET("/ws/*any", middlewares.Cors(), gin.WrapH(server))
}

修改:bootstrap/route.go 文件:

...
routes.RegisterAPIRoutes(router)

//注册 Ws 路由
routes.RegisterWebsocketRoutes(router)

setup404Handler(router)
...

3. 您期望得到的结果?

能够正常运行

4. 您实际得到的结果?

运行报错:

2022/09/04 16:30:25 socketio listen error: EOF
exit status 1

并无具体错误原因输出。不知道咋排查了…

讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!