NodeJS socket IO停止随机发射?

27

我正在运行Node 0.6.16,并且所有模块都是最新的,至少根据npm来看是这样的(win7 x64)。 我注意到,即使没有发生任何断开连接,但由于某种原因,经过一段时间后,我无法确定,可能是1小时后,浏览器不会接收到任何数据。 在Firefox上似乎比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')});

编辑2:升级到最新版本的socket.io(1.2.1)和node v0.10.35后,我仍然遇到相同的问题。更让人惊讶的是,我在客户端添加了以下代码:

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

intv = setInterval(checkSocket, 1000);
虽然该函数每秒运行一次,但即使它不再接收任何数据并仍在发送心跳,它也从未记录套接字已断开连接的日志...。
编辑3:好吧,问题出在我的服务器端代码上,一些套接字被销毁了。我还更新到了v1.x,并强制重新连接。

1
我认为这个问题现在应该已经解决了。 - Farid Nouri Neshat
我也遇到了这个问题。我的项目是一个需要sockets获取当前播放的歌曲/封面的收音机。以前长轮询有效,但是对于大量的请求失败了。最终我通过将窗口失去焦点和获得焦点与一个setTimeout绑定起来,以便发出重新加入房间的请求(然后重新发送相关数据)。希望有一天能找到更好的解决方案! - youanden
不是与问题相关,但我曾经使用计时器来检查套接字连接,现在我使用以下代码:socket.on('disconnect', function() { console.log("disconnected!"); socket.io.close(); }); 您还可以使用以下代码检查错误:socket.on('connect_error', function() { console.log("error!"); socket.io.close(); }); 如果有服务器问题,否则客户端套接字将每3秒记录一次错误消息。 - Data
将你的“服务器端”工作代码添加到未来用户中,如何? - Fer To
你在"data"事件中得到了一个长度为零的块吗?这意味着套接字已关闭。 - Matt Cobb
显示剩余9条评论
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];     
   });
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接