go - 如果我不在任何地方阅读消息,则不会为 gorilla /websocket 调用 CloseHandler,我最终只会收到写入错误

标签 go websocket gorilla

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

我有一种情况,我只是将消息写入一组 websockets。当我在浏览器端关闭 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 调用中遇到错误。

最佳答案

关闭处理程序在 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
        }
    }
 }

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

关于go - 如果我不在任何地方阅读消息,则不会为 gorilla /websocket 调用 CloseHandler,我最终只会收到写入错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48314386/

相关文章:

go - VSCODE gopath 不同于 shell 中设置的 GOPATH

algorithm - 去吧,Dijkstra : print out the path, 不只是计算最短距离

go - 两个Uint64的意外加法行为

node.js - 如何在 node.js 和 socket.io 应用程序中组织套接字处理

java - Spring 启动和 RabbitMQ : Failed to connect to reactor. io.net.impl.netty.tcp.NettyTcpClient

go - 将在所有其他处理程序之前运行的中间件

php - 编码、序列化和编码

javascript - 从 Chrome 扩展中 Hook Websocket

go - mux.Vars 不工作

session - 无法通过键获取 gorilla session 。值