乐趣区

关于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

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

退出移动版