如何使用ws.SetWriteDeadline?

时间:2016-06-14 21:11:35

标签: go

当我关闭浏览器时,我想在3秒而不是1分钟内断开websocket。以下只是在没有错误的情况下写入void,直到tcp ip timeout我猜,而不是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

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

1 个答案:

答案 0 :(得分:4)

您正在使用WriteDeadline吗?截止日期指定将数据写入TCP堆栈缓冲区的时间,而不是对等方接收数据的时间(如果它完全一样)。

为了可靠地检测已关闭的连接,应用程序应将PING发送给对等方并等待预期的PONG。您使用的软件包不支持此功能,但Gorilla软件包支持此功能。 Gorilla chat application显示了如何使用PING和PONG来检测已关闭的连接。