我正在使用 this library .几个小时或一天后,websocket.JSON.Recieve 将出错并获得 EOF。我再次连接到 Web 套接字,没有问题,但我一直收到 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
}
最佳答案
我最好的猜测是它与“最大打开文件数”有某种关系。这是一个远景,但试一试。
您的服务器/库没有正确关闭/释放结束/失效的连接。
它特定于操作系统,但我猜您使用的是 Linux。 所以下次你出现问题时(在你重新启动你的应用程序之前)你能运行
# lsof -p PID | wc -l
# lsof -a -p PID | wc -l
或
# cd /proc/PID/fd; ls -l | wc -l
服务器控制台上的服务器应用程序 PID 的 PID 在哪里?并将它与 lsof -a -p PID
一起发布到此处,通过指向 gist 或其他内容的链接(因为我期待长列表)。
使用# ps aux | 查找PID grep APPNAME
或 # pidof APPNAME
。
您可以检查服务器范围内的“最大打开文件数”
sysctl fs.file-max
如果是这种情况,您可以使用 sysctl -w fs.file-max= 100000
增加最大打开文件数,但这只会延迟不可避免的事情,或者深入研究代码并处理这些未终止的连接.
有用的链接 list open files , max open files或自己谷歌。
关于go - 尝试恢复 Websocket 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37663016/