【发布时间】:2021-05-12 05:04:39
【问题描述】:
我正在关注 gorilla websocket 库的聊天客户端/服务器示例。
https://github.com/gorilla/websocket/blob/master/examples/chat/hub.go#L36
我尝试修改代码以在新客户端连接时通知其他客户端,如下所示:
for {
select {
case client := <-h.register:
h.clients[client] = true
// My addition. Hangs after this (no further register/unregister events are processed):
h.broadcast <- []byte("Another client connected!")
case client := <-h.unregister:
if _, ok := h.clients[client]; ok {
delete(h.clients, client)
close(client.send)
}
case message := <-h.broadcast:
for client := range h.clients {
select {
case client.send <- message:
default:
close(client.send)
delete(h.clients, client)
}
}
}
}
}
我的理解是在外部for 循环的下一次迭代中,广播频道应该接收该数据并遵循message 案例中的逻辑,但它只是挂起。
为什么?我找不到任何理由。没有进一步处理频道事件(注册/注销或广播没有任何内容),这让我认为它是某种无缓冲的频道机制,但我不明白如何?
【问题讨论】:
标签: go websocket channel gorilla