当我关闭浏览器时,我想在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
在它最终关闭连接之前,大约需要一分钟或更长时间。
答案 0 :(得分:4)
您正在使用WriteDeadline吗?截止日期指定将数据写入TCP堆栈缓冲区的时间,而不是对等方接收数据的时间(如果它完全一样)。
为了可靠地检测已关闭的连接,应用程序应将PING发送给对等方并等待预期的PONG。您使用的软件包不支持此功能,但Gorilla软件包支持此功能。 Gorilla chat application显示了如何使用PING和PONG来检测已关闭的连接。