如何使用 ws.SetWriteDeadline?

当我关闭浏览器时,我想在 3 秒而不是 1 分钟内断开 websocket。以下只是继续写入一个没有错误的空白,直到我猜的 tcp ip 超时,而不是 SetWriteDeadline。


f := func(ws *websocket.Conn) {

    for {

        select {

        case msg := <-out:

            ws.SetWriteDeadline(time.Now().Add(3 * time.Second))

            if _, err := ws.Write([]byte(msg)); err != nil {

                fmt.Println(err)

                return

            }

        case <-time.After(3 * time.Second):

            fmt.Println("timeout 3")

            return

        }

    }

}

return websocket.Handler(f)

我需要等待这个错误


write tcp [::1]:8080->[::1]:65459: write: broken pipe


在它最终关闭连接之前,这大约需要一分钟或更长时间。


PIPIONE
浏览 580回答 1
1回答

慕标琳琳

您是否正确使用了 WriteDeadline。截止日期指定将数据写入 TCP 堆栈缓冲区的时间,而不是对等方接收数据的时间(如果有的话)。为了可靠地检测关闭的连接,应用程序应该向对等方发送 PING 并等待预期的 PONG。您使用的包不支持此功能,但Gorilla包支持。Gorilla 聊天应用程序展示了如何使用 PING 和 PONG 来检测关闭的连接。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go