当我关闭浏览器时,我想在 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在它最终关闭连接之前,这大约需要一分钟或更长时间。
1 回答
慕标琳琳
TA贡献1830条经验 获得超9个赞
您是否正确使用了 WriteDeadline。截止日期指定将数据写入 TCP 堆栈缓冲区的时间,而不是对等方接收数据的时间(如果有的话)。
为了可靠地检测关闭的连接,应用程序应该向对等方发送 PING 并等待预期的 PONG。您使用的包不支持此功能,但Gorilla包支持。Gorilla 聊天应用程序展示了如何使用 PING 和 PONG 来检测关闭的连接。
- 1 回答
- 0 关注
- 578 浏览
添加回答
举报
0/150
提交
取消