在gofiber框架中使用的时v2routes包中的代码:v1Getws middlewaresIsWs中间件已经使用Upgrade方法升级HTTP连接为WebSocket连接 websocketNewws_serverWsws_server包中的代码如下:package ws_serverimport githubcomgofiberwebsocketv2models_ws go_fiber_v
package ws_server
import ( "github.com/gofiber/websocket/v2" "sync" )
// 定义全局变量,用于储存ws链接 var wsConnections sync.Map
// 注册ws为websocket链接 func Ws(c *websocket.Conn) { // 读取上下文信息,后续可以用来判断用户是否过期,token是否有效 user := getContextInfo(c) // 将当前链接存储到全局变量中 wsConnections.Store(user.Token, c) for { // 读取用户发来的信息 _, message, err := c.ReadMessage() if err != nil { // 如果读取失败,则移除该链接 wsConnections.Delete(user.Token) return } // 根据不同的订阅请求返回不同的数据 // TODO:根据业务逻辑处理message
// 给指定id发送消息
// TODO:根据业务逻辑处理发送消息
}
}
// 获取上下文信息 func getContextInfo(c *websocket.Conn) *models_ws.ReadMessage { token, ok := c.Locals("token").(string) if !ok { //测试用,返回一个空的结构体 return &models_ws.ReadMessage{UserName: "游客?"} } return &models_ws.ReadMessage{ Token: token, Exp: int64(c.Locals("exp").(float64)), UserName: c.Locals("username").(string), TelegramId: int64(c.Locals("telegram_id").(float64)), BotId: int64(c.Locals("bot_id").(float64)), Role: int64(c.Locals("role").(float64)), Ip: c.Locals("ip").(string), } }
// 给指定id发送消息 func SendMsgToId(id string, message []byte) { if conn, ok := wsConnections.Load(id); ok { conn.(*websocket.Conn).WriteMessage(websocket.TextMessage, message) } }
// 给指定user发送消息 func SendMsgToUser(user *models_ws.ReadMessage, message []byte, field string) { // 遍历全局变量,找到所有符合条件的链接 wsConnections.Range(func(key, value interface{}) bool { if key.(string) != user.Token && user.Role == value.(*websocket.Conn).Locals(field) { value.(*websocket.Conn).WriteMessage(websocket.TextMessage, message) } return true }) }
// 给所有成员发送消息 func SendMsgToAll(message []byte) { // 遍历全局变量,给所有链接发送消息 wsConnections.Range(func(key, value interface{}) bool { value.(*websocket.Conn).WriteMessage(websocket.TextMessage, message) return true }) }
原文地址: https://www.cveoy.top/t/topic/W0K 著作权归作者所有。请勿转载和采集!