聊天示例显示了如何实现广播。如果不需要广播,则聊天示例不是应用程序的理想起点。
要将消息发送到特定的websocket连接,只需使用NextWriter或WriteMessage写入该连接。这些方法不支持并发编写器,因此您可能需要使用互斥量或goroutine来确保使用单个编写器。
查找特定
*websocket.Connection内容的简单方法是将其传递
*websocket.Connection给需要它的代码。如果应用程序需要将其他状态与连接相关联,则定义一个类型以保留该状态并向其传递指针:
type Client struct { conn *websocket.Conn mu sync.Mutex ...}
该
Hub可以进行修改,以将消息发送到特定的连接,但如果不需要广播这是一个迂回路径。方法如下:
将ID字段添加到客户端:
ID idType // replace idType with int, string, or whatever you want to use
将Gorilla中心字段从更改
connections map[*connection]bool为
connectionsmap[idType]*connection。
定义包含消息数据和目标客户端ID的消息类型:
type message struct { ID idtype data []byte}
将集线器广播字段替换为:
send chan message
将循环中心更改为:
for { select { case client := <-h.register: h.clients[client.ID] = client case client := <-h.unregister: if _, ok := h.clients[client.ID]; ok { delete(h.clients, client.ID) close(client.send) } case message := <-h.send: if client, ok := h.clients[message.ID]; ok { select { case client.send <- message.data: default: close(client.send) delete(h.connections, client) } } }
通过创建
message具有适当ID的将邮件发送到特定客户端:
hub.send <- message{ID: targetID, data: data}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)