使用gorilla websocket api for go,我怎么知道客户端是否仍然连接?
我现在尝试的是:
func Listen(ws *websocket.Conn) {
connTimeout := 3
timeLastSent := time.Now().Second()
for ((timeLastSent + connTimeout) % 60) != time.Now().Second() {
msg := Message{}
err := ws.ReadJSON(&msg)
if err == websocket.ErrCloseSent {
break
} else if err != nil {
continue
}
//Message recived
EventMessage <- msg
timeLastSent = time.Now().Second()
}
//Connection timed out.
return
}
但这会导致错误repeated read on failed websocket connection
。
我一直在研究使用ws.SetReadDeadline(t)
,但我不知道如何使用它,也不知道它甚至是我正在寻找的东西。
我该怎么办呢?
答案 0 :(得分:0)
当 websocket 连接失败并出现 websocket.ErrCloseSent
以外的错误时,程序会在一个紧密的循环中旋转直到超时。
为了帮助应用程序检测此编程错误,在失败的连接 (view code here) 上调用 read 1000 次时,websocket 包会发生混乱。
要解决问题,请在所有错误上跳出循环:
err := ws.ReadJSON(&msg)
if err != nil {
// optional: log the error
break
}
使用 the connection's read deadline 处理超时。