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 }) }

GoFiber Websocket 聊天服务示例:使用 v2.routes 包和 sync.Map 存储连接

原文地址: https://www.cveoy.top/t/topic/mgYL 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录