socketio客户端默默地丢失连接并创建新套接字(传输关闭)

时间:2015-10-14 22:42:49

标签: javascript node.js sockets socket.io

我正在研究用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

非常感谢任何有关“运输关闭”错误原因的帮助。

2 个答案:

答案 0 :(得分:0)

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

  

你的问题是套接字超时。如果某个套接字上没有活动,socket.io将自动关闭它。

     

一个简单(和hackish)修复方法是将心跳发送到连接的客户端以创建活动并停止套接字超时。

     

服务器:

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});
});

答案 1 :(得分:0)

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