CloseHandler不会为gorilla/websocket调用。如果我没有在任何地方阅读消息,我最终只会收到一个写错误

CloseHandler不会为gorilla/websocket调用。如果我没有在任何地方阅读消息,我最终只会收到一个写错误,go,websocket,gorilla,Go,Websocket,Gorilla,我有一个使用gorilla/websocket的websocket服务器 我遇到的情况是,我只是将消息写入一组WebSocket。在浏览器端关闭websocket时,不会调用自定义CloseHandler 但是,添加一个无限期调用ReadMessage(直到出现错误)的goroutine会导致调用CloseHandler 基本思路如下: 在一个goroutine中,我运行以下内容: for { for client := range clients { client.st

我有一个使用gorilla/websocket的websocket服务器

我遇到的情况是,我只是将消息写入一组WebSocket。在浏览器端关闭websocket时,不会调用自定义CloseHandler

但是,添加一个无限期调用ReadMessage(直到出现错误)的goroutine会导致调用CloseHandler

基本思路如下: 在一个goroutine中,我运行以下内容:

for {
    for client := range clients {
        client.stream <- data
    }
    time.Sleep(time.Second)
}

当我在浏览器端关闭websocket时,我希望会调用CloseHandler,但是,它从未被调用,相反,我最终在WriteMessage调用中得到一个错误。

当发生错误时,会调用CloseHandler。应用程序

如果应用程序未读取连接或对等方未发送关闭消息,则不会调用关闭处理程序

如果您的目标是检测关闭的连接,则读取连接,直到返回错误,如所示:


只有当应用程序必须在连接将关闭消息反弹回对等方之前执行某些操作时,应用程序才应设置关闭处理程序。

当发生错误时,才会调用关闭处理程序。应用程序

如果应用程序未读取连接或对等方未发送关闭消息,则不会调用关闭处理程序

如果您的目标是检测关闭的连接,则读取连接,直到返回错误,如所示:

只有当应用程序必须在连接将关闭消息反弹回对等方之前执行某些操作时,应用程序才应设置关闭处理程序

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
    }
}
func readLoop(c *websocket.Conn) {
    for {
        if _, _, err := c.NextReader(); err != nil {
            c.Close()
            break
        }
    }
 }