为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 ws.SetWriteDeadline?

如何使用 ws.SetWriteDeadline?

Go
PIPIONE 2022-01-17 18:15:52
当我关闭浏览器时,我想在 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 来检测关闭的连接。


查看完整回答
反对 回复 2022-01-17
  • 1 回答
  • 0 关注
  • 578 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信