关于go:客服系统即时通讯IM开发二Golang-Gin框架实现服务端WebScoket唯一客服网站在线客服系统

我的客服零碎应用的Golang+ Gin作为后端服务,所以上面的代码是演示demo

在 Go 语言中应用 Gin 框架实现 WebSocket 的办法如下:

装置 gin-gonic/websocket 库。
在 Gin 的路由处理函数中应用 ws.Upgrade 函数将 HTTP 连贯降级为 WebSocket 连贯。
在路由处理函数中应用 conn.ReadMessage 和 conn.WriteMessage 函数接管和发送音讯。
例如:

package main

import (
    "net/http"

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

var upgrader = websocket.Upgrader{
    CheckOrigin: func(r *http.Request) bool {
        return true
    },
}

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

    r.GET("/ws", func(c *gin.Context) {
        conn, err := upgrader.Upgrade(c.Writer, c.Request, nil)
        if err != nil {
            http.NotFound(c.Writer, c.Request)
            return
        }

        for {
            // 读取音讯
            _, message, err := conn.ReadMessage()
            if err != nil {
                break
            }

            // 发送音讯
            err = conn.WriteMessage(websocket.TextMessage, message)
            if err != nil {
                break
            }
        }
    })

    r.Run()
}

下面的代码中,咱们在 /ws 路由处理函数中应用 upgrader.Upgrade 函数将 HTTP 连贯降级为 WebSocket 连贯。而后,咱们应用 conn.ReadMessage 函数读取音讯,应用 conn.WriteMessage 函数发送音讯。

前端连贯Conn保留

咱们须要把前端链接过去的WebSocket Conn保留下来,这样才能够在其余中央去调用这个Conn发送音讯

能够应用一个全局的变量来保留前端连贯。

例如,你能够应用一个全局的 map 类型变量来保留前端连贯,这样就能够在其余中央拜访连贯了。

例如:

package main

import (
    "net/http"

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

var upgrader = websocket.Upgrader{
    CheckOrigin: func(r *http.Request) bool {
        return true
    },
}

// 定义一个全局的 map 类型变量来保留前端连贯
var connections = make(map[*websocket.Conn]bool)

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

    r.GET("/ws", func(c *gin.Context) {
        conn, err := upgrader.Upgrade(c.Writer, c.Request, nil)
        if err != nil {
            http.NotFound(c.Writer, c.Request)
            return
        }

        // 将连贯保留到全局变量中
        connections[conn] = true

        for {
            // 读取音讯
            _, message, err := conn.ReadMessage()
            if err != nil {
                delete(connections, conn)
                break
            }

            // 发送音讯
            err = conn.WriteMessage(websocket.TextMessage, message)
            if err != nil {
                delete(connections, conn)
                break
            }
        }
    })

    r.Run()
}

下面的代码中,咱们在每个前端连贯建设时将连贯保留到全局变量中,在连贯断开时将连贯从全局变量中删除。

在其余中央拜访保留的前端连贯,能够应用上面的代码:

for conn := range connections {
  err := conn.WriteMessage(websocket.TextMessage, []byte("音讯内容"))
  if err != nil {
    delete(connections, conn)
  }
}

当然咱们map全局变量,须要应用一个访客id标识来作为key,前面再具体阐明

惟一在线客服零碎
https://gofly.v1kf.com

十年开发教训程序员,到职全心守业中,历时三年开发出的产品《惟一客服零碎》

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理