我的客服系統使用的Golang+ Gin作為後端服務,所以下麵的代碼是演示demo 在 Go 語言中使用 Gin 框架實現 WebSocket 的方法如下: 安裝 gin-gonic/websocket 庫。 在 Gin 的路由處理函數中使用 ws.Upgrade 函數將 HTTP 連接升級為 We ...
我的客服系統使用的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,後面再詳細說明