a
This commit is contained in:
@@ -32,16 +32,18 @@ type EventController struct {
|
|||||||
|
|
||||||
//连接的客户端,吧每个客户端都放进来
|
//连接的客户端,吧每个客户端都放进来
|
||||||
var clients = make(map[int]map[string]*websocket.Conn)
|
var clients = make(map[int]map[string]*websocket.Conn)
|
||||||
|
var heartClients = make(map[string]*websocket.Conn)
|
||||||
|
|
||||||
//广播频道(通道)
|
//广播频道(通道)
|
||||||
var broadcast = make(chan *model.ImMessageRecord)
|
var broadcast = make(chan *model.ImMessageRecord)
|
||||||
|
var heartbit = make(chan *Message)
|
||||||
|
|
||||||
// 配置升级程序(升级为websocket)
|
// 配置升级程序(升级为websocket)
|
||||||
var upgrader = websocket.Upgrader{}
|
var upgrader = websocket.Upgrader{}
|
||||||
|
|
||||||
// 定义我们的消息对象
|
|
||||||
type Message struct {
|
type Message struct {
|
||||||
Data interface{} `json:"data"`
|
UserID string `json:"userID"`
|
||||||
|
Data interface{} `json:"data"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// @Title 测试websocket
|
// @Title 测试websocket
|
||||||
@@ -73,6 +75,7 @@ func (c *EventController) TestWebsocket() {
|
|||||||
if len(messageGroups) == 0 {
|
if len(messageGroups) == 0 {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
heartClients[userID] = ws
|
||||||
clientUser[userID] = ws
|
clientUser[userID] = ws
|
||||||
for _, v := range messageGroups {
|
for _, v := range messageGroups {
|
||||||
if len(clients[v.GroupID]) > 0 {
|
if len(clients[v.GroupID]) > 0 {
|
||||||
@@ -101,12 +104,17 @@ func (c *EventController) TestWebsocket() {
|
|||||||
//接收客户端的消息
|
//接收客户端的消息
|
||||||
err := ws.ReadJSON(&s)
|
err := ws.ReadJSON(&s)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
globals.SugarLogger.Debugf("页面可能断开啦 ws.ReadJSON error: %v", err.Error())
|
var m *Message
|
||||||
for k, _ := range clients {
|
if err2 := ws.ReadJSON(&m); err2 == nil {
|
||||||
delete(clients[k], userID)
|
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 {
|
} else {
|
||||||
//接受消息 业务逻辑
|
//接受消息 业务逻辑
|
||||||
broadcast <- s
|
broadcast <- s
|
||||||
@@ -145,23 +153,33 @@ func init() {
|
|||||||
//广播推送消息
|
//广播推送消息
|
||||||
func handleMessages() {
|
func handleMessages() {
|
||||||
for {
|
for {
|
||||||
|
select {
|
||||||
//读取通道中的消息
|
//读取通道中的消息
|
||||||
msg := <-broadcast
|
case msg := <-broadcast:
|
||||||
globals.SugarLogger.Debugf("clients len %v", len(clients))
|
globals.SugarLogger.Debugf("clients len %v", len(clients))
|
||||||
//循环map客户端
|
//循环map客户端
|
||||||
for userID, client := range clients[msg.GroupID] {
|
for userID, client := range clients[msg.GroupID] {
|
||||||
//把通道中的消息发送给客户端
|
//把通道中的消息发送给客户端
|
||||||
user, err := dao.GetUser(dao.GetDB(), msg.UserID)
|
user, err := dao.GetUser(dao.GetDB(), msg.UserID)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
msg.UserInfo = user
|
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))
|
case h := <-heartbit:
|
||||||
err = client.WriteJSON(msg)
|
if err := heartClients[h.UserID].WriteJSON(&Message{
|
||||||
if err != nil {
|
Data: "pang",
|
||||||
globals.SugarLogger.Debugf("client.WriteJSON error: %v", err)
|
}); err != nil {
|
||||||
client.Close() //关闭
|
globals.SugarLogger.Debugf("userheart client.WriteJSON error: %v", err)
|
||||||
delete(clients[msg.GroupID], userID)
|
heartClients[h.UserID].Close()
|
||||||
// delete(clients, client) //删除map中的客户端
|
delete(heartClients, h.UserID)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user