【发布时间】:2018-01-18 13:58:46
【问题描述】:
我有一个使用 gorilla/websocket 的 websocket 服务器。
我有一种情况,我只是将消息写入一组 websocket。当我在浏览器端关闭 websocket 时,我的自定义 CloseHandler 永远不会被调用。
但是,添加一个无限期调用 ReadMessage(直到出现错误)的 goroutine 会导致 CloseHandler 被调用。
这是基本思想: 在一个 goroutine 中,我运行这样的东西:
for {
for client := range clients {
client.stream <- data
}
time.Sleep(time.Second)
}
和其他代码,在单独的 goroutine 中调用,每个客户端一个:
go (func() {
// If I call wsock.ReadMessage here, my CloseHandler works!
})()
for msg := range myclient.stream {
if err := wsock.WriteMessage(websocket.TextMessage, msg); err != nil {
break
}
}
当我在浏览器端关闭 websocket 时,我希望 CloseHandler 被调用,但是,它从未被调用,相反,我最终在 WriteMessage 调用时收到错误。
【问题讨论】: