From 3320ff243828cc789d5cbac212685a680408ffb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E5=B0=B9=E5=B2=9A?= <770236076@qq.com> Date: Mon, 31 Aug 2020 17:53:19 +0800 Subject: [PATCH] =?UTF-8?q?=E8=81=8A=E5=A4=A9=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controllers/event.go | 68 +++++++++++++++++++++++++++----------------- 1 file changed, 42 insertions(+), 26 deletions(-) diff --git a/controllers/event.go b/controllers/event.go index f106a6d5a..6450a9853 100644 --- a/controllers/event.go +++ b/controllers/event.go @@ -29,10 +29,10 @@ type EventController struct { } //连接的客户端,吧每个客户端都放进来 -var clients = make(map[*websocket.Conn]bool) +var clients = make(map[string][]*websocket.Conn) //广播频道(通道) -var broadcast = make(chan []*model.ImMessageRecord) +var broadcast = make(chan map[string][]*model.ImMessageRecord) // 配置升级程序(升级为websocket) var upgrader = websocket.Upgrader{} @@ -129,9 +129,13 @@ func (c *EventController) TestWebsocket() { log.Fatal(err) } defer ws.Close() + var ( + vendorOrderID = c.GetString("vendorOrderID") + msgMap = make(map[string][]*model.ImMessageRecord) + ) //将当前客户端放入map中 - clients[ws] = true - //聊天记录 + clients[vendorOrderID] = append(clients[vendorOrderID], ws) + db := dao.GetDB() _, _, err = jxcontext.New(nil, c.GetString("token"), c.Ctx.ResponseWriter, c.Ctx.Request) if err != nil { @@ -141,17 +145,6 @@ func (c *EventController) TestWebsocket() { } ws.WriteJSON(&msg) } - // records, _ := dao.GetImMessageRecord(db, c.GetString("vendorOrderID"), "", 0, -1) - // if len(records) > 0 { - // 把消息 写入通道 - // broadcast <- records - // } else { - // broadcast <- []*model.ImMessageRecord{ - // &model.ImMessageRecord{ - // Content: "第一条", - // }, - // } - // } c.EnableRender = false //Beego不启用渲染 @@ -161,11 +154,22 @@ func (c *EventController) TestWebsocket() { err := ws.ReadJSON(&s) if err != nil { globals.SugarLogger.Debugf("页面可能断开啦 ws.ReadJSON error: %v", err.Error()) - delete(clients, ws) //删除map中的客户端 - break //结束循环 + index := 0 + for k, v := range clients[vendorOrderID] { + if v == ws { + index = k + } + } + wsList := clients[vendorOrderID] + clients[vendorOrderID] = clients[vendorOrderID][0:0] + clients[vendorOrderID] = append(clients[vendorOrderID], wsList[0:index]...) + clients[vendorOrderID] = append(clients[vendorOrderID], wsList[index+1:len(wsList)]...) + // delete(clients, ws) //删除map中的客户端 + break //结束循环 } else { //接受消息 业务逻辑 - broadcast <- s + msgMap[vendorOrderID] = append(msgMap[vendorOrderID], s...) + broadcast <- msgMap for _, v := range s { dao.WrapAddIDCULDEntity(v, "") dao.CreateEntity(db, v) @@ -186,14 +190,26 @@ func handleMessages() { msg := <-broadcast globals.SugarLogger.Debugf("clients len %v", len(clients)) //循环map客户端 - for client := range clients { - //把通道中的消息发送给客户端 - 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, client) //删除map中的客户端 + for vendorOrderID, mmsg := range msg { + for _, client := range clients[vendorOrderID] { + //把通道中的消息发送给客户端 + globals.SugarLogger.Debugf("msg %v", utils.Format4Output(mmsg, false)) + err := client.WriteJSON(mmsg) + if err != nil { + globals.SugarLogger.Debugf("client.WriteJSON error: %v", err) + client.Close() //关闭 + index := 0 + for k, v := range clients[vendorOrderID] { + if v == client { + index = k + } + } + wsList := clients[vendorOrderID] + clients[vendorOrderID] = clients[vendorOrderID][0:0] + clients[vendorOrderID] = append(clients[vendorOrderID], wsList[0:index]...) + clients[vendorOrderID] = append(clients[vendorOrderID], wsList[index+1:len(wsList)]...) + // delete(clients, client) //删除map中的客户端 + } } } }