试图恢复Websocket连接

时间:2016-06-06 16:59:28

标签: go websocket

我正在使用this library。几小时或一天后,websocket.JSON.Recieve将出错,并将获得EOF。我再次连接到网络套接字没有任何问题,但是我只是继续获得EOF,直到我重新启动我的应用程序。

func getMessage(ws *websocket.Conn) (m Message, err error) {
    err = websocket.JSON.Receive(ws, &m)
    if err != nil {
        log.Printf("Get Message - %s - Reconnecting...", err)
        ws, _ = connect(token) // This just does a dial
        err = websocket.JSON.Receive(ws, &m)
    }
    return
}

1 个答案:

答案 0 :(得分:1)

我最好的猜测是它与“最大打开文件”有某种关联。这是一个很长的镜头,但试一试。

您的服务器/ lib未正确关闭/释放已结束/已结束的连接。

它的操作系统特定,但我猜你使用的是Linux。 因此,下次问题发生时(重新启动应用程序之前),您可以运行

# lsof -p PID | wc -l
# lsof -a -p PID | wc -l

OR

# cd /proc/PID/fd; ls -l | wc -l

其中PID是服务器控制台上的服务器应用程序PID?并将其与lsof -a -p PID一起发布,通过链接到gist或其他东西(因为我期待很长的名单)。

使用# ps aux | grep APPNAME# pidof APPNAME找到PID。

您可以使用

检查服务器范围的“最大打开文件”
sysctl fs.file-max

如果是这种情况,您可以使用sysctl -w fs.file-max= 100000增加最大打开文件,但它只会延迟不可避免的情况,或者深入研究代码并处理这些未终止的连接。

有用链接list open filesmax open files或谷歌自己。