【问题标题】:socketio client silently loses connection and creates new socket (transport close)socketio 客户端静默丢失连接并创建新套接字(传输关闭)
【发布时间】:2016-01-13 05:22:37
【问题描述】:

我正在制作一个用ccapture 录制的threejs 动画

这取决于每个客户端与节点后端的单个连接,该节点后端接收“渲染帧”套接字事件。

这工作了一段时间,但几分钟后,客户端在没有出错的情况下关闭连接,然后创建一个新连接,从而丢失第一个初始套接字连接。我一直保持窗口打开并保持焦点。

我的套接字调试日志显示以下内容。它总是适用于几帧,但总是在一定但不一致的时间后下降:

socket.io:socket emitting event ["render-frame",{"frame":168}] +0ms
render frame
{ frame: 168 }
socket.io:client client close with reason transport close +6ms
socket.io:socket closing socket - reason transport close +0ms
socket.io:client ignoring remove for fbD1a4Wx0jBzJ7hqAAAA +1ms
SOCKET DISCONNECTED!

我在节点后端简化了渲染帧侦听器以进行调试,现在它看起来像这样:

io.on("connection", function (socket) {
    socket.on("disconnect", function (socket) {
        console.log("SOCKET DISCONNECTED!");
    });
    socket.on("render-frame", function (data) {
        console.log(data);
    });
});

这在所有浏览器中都会发生,尽管我只需要它在 chrome 中工作。使用 socket.io 1.3.7

任何有关“传输关闭”错误原因的帮助将不胜感激。

【问题讨论】:

  • 您在哪种设备上运行客户端? CPU 或网络连接是否存在任何可能的节电问题?
  • 遇到同样的问题,而且添加 ping/pong 的建议似乎有点矫枉过正。这个问题似乎也只是“突然”发生(怎么可能?),它发生在 1.3.5 中......然后将 express 和 socket.io 升级到最新版本,它继续发生????跨度>
  • 跟进我的评论 - 我正在使用“HackTimer”来解决我在 Chrome 中遇到的非活动标签问题。我没有按照他们的文档中的描述将脚本放在我的 JavaScript 文件的顶部,并且不出所料地导致了这种意外行为。

标签: javascript node.js sockets socket.io


【解决方案1】:

我认为你应该看看这个问题:NodeJS + Socket.io connections dropping/reconnecting?

您的问题与套接字超时有关。如果某个socket没有活动,socket.io会自动关闭它。

一个简单的(和骇人听闻的)修复方法是向连接的客户端发送心跳以创建活动并阻止套接字超时。

服务器:

function sendHeartbeat(){
    setTimeout(sendHeartbeat, 8000);
    io.sockets.emit('ping', { beat : 1 });
}

io.sockets.on('connection', function (socket) {
    socket.on('pong', function(data){
        console.log("Pong received from client");
    });
}

setTimeout(sendHeartbeat, 8000);

客户:

socket.on('ping', function(data){
    socket.emit('pong', {beat: 1});
});

【讨论】:

  • 默认socketio有心跳...参数可以修改pingTimeout和pingInterval。你可以在这里阅读它github.com/socketio/engine.io .. 另外你可以在调试输出中看到所有的 ping/pong 请求:sudo DEBUG=engine:* node index.js
  • 有了 pingTimeout 和 pingInterval 我仍然每隔几秒就会遇到同样的问题,因为套接字传输关闭。上面的解决方案很好地解决了由于空闲超时而关闭的套接字。对我来说问题解决了
【解决方案2】:

HackTimer.js 和 ccapture.js 似乎都用自定义函数替换了 window.setTimeout。如果 HackTimer.js 在任何其他 JavaScript 之前执行,它似乎可以正常工作。对于 ccapture.js,您可能需要尝试确保它作为第一个脚本运行。因此,SocketIO 首先使用浏览器的本机 setTimeout,然后被自定义的 setTimeout 吹走,这会破坏任何当前正在运行的计时器。

【讨论】:

    猜你喜欢
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 2015-05-15
    • 2013-04-21
    • 1970-01-01
    • 2015-02-08
    相关资源
    最近更新 更多