【问题标题】:CloseHandler is not called for a gorilla/websocket if I am not reading messages anywhere, I simply get a write error eventually如果我没有在任何地方阅读消息,则不会为 gorilla/websocket 调用 CloseHandler,我最终只会收到写入错误
【发布时间】: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 调用时收到错误。

【问题讨论】:

    标签: go websocket gorilla


    【解决方案1】:

    close message is received from the peer 时调用关闭处理程序。应用程序must read the connection to receive close and other control messages

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

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

    func readLoop(c *websocket.Conn) {
        for {
            if _, _, err := c.NextReader(); err != nil {
                c.Close()
                break
            }
        }
     }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-12
      • 1970-01-01
      • 2015-01-25
      • 1970-01-01
      • 2021-05-14
      • 2020-12-03
      • 1970-01-01
      • 2020-07-12
      相关资源
      最近更新 更多