From 609a74e559633651e2ac888dfb2e09fbbb764849 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E5=B0=B9=E5=B2=9A?= <770236076@qq.com> Date: Thu, 3 Dec 2020 17:32:13 +0800 Subject: [PATCH] a --- controllers/event_controller.go | 62 +++++++++++++++++++++------------ 1 file changed, 40 insertions(+), 22 deletions(-) diff --git a/controllers/event_controller.go b/controllers/event_controller.go index f41121624..f7649937b 100644 --- a/controllers/event_controller.go +++ b/controllers/event_controller.go @@ -32,16 +32,18 @@ type EventController struct { //连接的客户端,吧每个客户端都放进来 var clients = make(map[int]map[string]*websocket.Conn) +var heartClients = make(map[string]*websocket.Conn) //广播频道(通道) var broadcast = make(chan *model.ImMessageRecord) +var heartbit = make(chan *Message) // 配置升级程序(升级为websocket) var upgrader = websocket.Upgrader{} -// 定义我们的消息对象 type Message struct { - Data interface{} `json:"data"` + UserID string `json:"userID"` + Data interface{} `json:"data"` } // @Title 测试websocket @@ -73,6 +75,7 @@ func (c *EventController) TestWebsocket() { if len(messageGroups) == 0 { return } + heartClients[userID] = ws clientUser[userID] = ws for _, v := range messageGroups { if len(clients[v.GroupID]) > 0 { @@ -101,12 +104,17 @@ func (c *EventController) TestWebsocket() { //接收客户端的消息 err := ws.ReadJSON(&s) if err != nil { - globals.SugarLogger.Debugf("页面可能断开啦 ws.ReadJSON error: %v", err.Error()) - for k, _ := range clients { - delete(clients[k], userID) + var m *Message + if err2 := ws.ReadJSON(&m); err2 == nil { + m.UserID = userID + heartbit <- m + } else { + globals.SugarLogger.Debugf("页面可能断开啦 ws.ReadJSON error: %v", err.Error()) + for k, _ := range clients { + delete(clients[k], userID) + } + break //结束循环 } - // delete(clients, ws) //删除map中的客户端 - break //结束循环 } else { //接受消息 业务逻辑 broadcast <- s @@ -145,23 +153,33 @@ func init() { //广播推送消息 func handleMessages() { for { + select { //读取通道中的消息 - msg := <-broadcast - globals.SugarLogger.Debugf("clients len %v", len(clients)) - //循环map客户端 - for userID, client := range clients[msg.GroupID] { - //把通道中的消息发送给客户端 - user, err := dao.GetUser(dao.GetDB(), msg.UserID) - if err == nil { - msg.UserInfo = user + case msg := <-broadcast: + globals.SugarLogger.Debugf("clients len %v", len(clients)) + //循环map客户端 + for userID, client := range clients[msg.GroupID] { + //把通道中的消息发送给客户端 + user, err := dao.GetUser(dao.GetDB(), msg.UserID) + if err == nil { + msg.UserInfo = user + } + globals.SugarLogger.Debugf("msg %v", utils.Format4Output(msg, false)) + err = client.WriteJSON(msg) + if err != nil { + globals.SugarLogger.Debugf("client.WriteJSON error: %v", err) + client.Close() //关闭 + delete(clients[msg.GroupID], userID) + // delete(clients, client) //删除map中的客户端 + } } - globals.SugarLogger.Debugf("msg %v", utils.Format4Output(msg, false)) - err = client.WriteJSON(msg) - if err != nil { - globals.SugarLogger.Debugf("client.WriteJSON error: %v", err) - client.Close() //关闭 - delete(clients[msg.GroupID], userID) - // delete(clients, client) //删除map中的客户端 + case h := <-heartbit: + if err := heartClients[h.UserID].WriteJSON(&Message{ + Data: "pang", + }); err != nil { + globals.SugarLogger.Debugf("userheart client.WriteJSON error: %v", err) + heartClients[h.UserID].Close() + delete(heartClients, h.UserID) } } }