27

我正在运行 Node 0.6.16,并且所有模块至少根据 npm (win7 x64) 是最新的。我可以注意到,即使我没有断开连接,但由于某种原因,过了一段时间,我无法判断,可能是 1 小时,浏览器没有收到任何数据。在 FF 上似乎比在 Chrome 上更频繁。

socket.on('disconnect', function (){console.log('disconnected')});

这永远不会针对该特定事件触发(我的意思是它可能发生,但随后我得到日志并且 socket.io 自动重新连接 - 在这种情况下,什么都没有发生,它只是停止工作,这是最常见的事件)。

所以我不知道在哪里看。NodeJS 仍然记录心跳,但由于某种原因,连接没有通过。我怀疑,在(任何?)浏览器的选项卡更改时,一段时间后,由于窗口/选项卡不再具有焦点,socket.io 停止接收数据?我可能是错的,它可能与焦点无关,但这是我的主要线索。其他人有任何想法吗?

编辑:客户端非常简单:

socket = io.connect('http://xxx.xxx.xxx.xxx:8081', {secure:false, 'reconnect': true, 'reconnection delay': 500, 'max reconnection attempts': 10});      
            socket.on('connect', function(){console.log('connected')});
            socket.on('message', function(data){//do something);        

            socket.on('disconnect', function (){console.log('disconnected')});

Edit2:更新到最新版本的 socket.io (1.2.1) 和节点 v0.10.35 后,我仍然遇到同样的问题。更令人惊讶的是,我在客户端中添加了以下代码:

function checkSocket(){
    if(socket){
        if(!socket.connected){
            console.log('socket disconnected');
            clearInterval(intv);
        }
    }       
}

intv = setInterval(checkSocket, 1000);

虽然该函数每秒运行一次,但它永远不会记录套接字已断开连接,即使它不再接收任何内容并且仍在发送心跳。

Edit3:好的,这是在我的服务器端代码上,一些套接字被破坏了。还更新到 v1.x 并强制重新连接。

4

1 回答 1

0

因此,既然我似乎没有更多问题,我想我会分享我的后端代码。我相信我的问题是我正在覆盖套接字。

var clients = {};
var app = require('https').createServer(options),
io = require('socket.io').listen(app);  
app.listen(8081);

io.sockets.on('connection', function(__socket) {
    var id = __socket.id;
    var ip = __socket.request.connection.remoteAddress;
    clients[id] = {socket:__socket, ip:ip}; 
    clients[id].socket.on('disconnect', function() {
        delete clients[id];     
   });
});
于 2015-06-26T22:51:16.867 回答