Gorilla Websocket - 读取错误:重复读取失败的websocket连接

时间:2016-05-21 17:44:04

标签: go websocket server gorilla

使用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),但我不知道如何使用它,也不知道它甚至是我正在寻找的东西。

我该怎么办呢?

1 个答案:

答案 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 处理超时。