2015-03-16 17 views
10

socket.io v1.2.1'in kullanılması (yalnızca "yoklama" aktarımı kullanılarak), bazen istemcilerim bağlantı kesintileri yaşar.socket.io: Olayı kes - 'aktarma kapat', 'istemci ad alanı kes', 'aktarım hatası' ve 'zorla kapat'

Bağlantılı etkinlik geri çağırma işlevimde ping timeout aldığım zamanın yaklaşık% 50'si makul.

Diğer zamanlarda, transport close, client namespace disconnect, transport error ve forced close'u alır. Dokümantasyondaki bağlantı kesme nedenlerine herhangi bir referans bulamadım ve anlamlarını koddan gerçekten anlamıyorlardı.

Her bağlantıyı en iyi şekilde halleddiğimden emin olmak istiyorum (ve belki bunları engelleyebilir). Belki birileri bu nedenlerden dolayı biraz ışık tutabilir.

cevap

0

Maalesef bu olabilir. Bazen, uğraşmak gibi bir talihsizlik yaşadığım için, aramda, sunucuda ve diğer müşteriler arasında güvenlik duvarı vardı.ping için

bu i kodundan yorumlamak ne az ya da çok, sen bir belge yok

io = require('socket.io')(httpServer, { pingInterval: 60000 }); 
+0

, sadece geçici bir çözüm olup gerçek bir çözümdür. Gerçekten bağlantıyı kaybettik müşteriler hala bağlı onların benziyorsun neden olacaktır. –

2

sunucu tarafında ping aralığı artırmak için deneyebilirsiniz zaman aşımları:

Forced close - soket kapanış durumundadır

Forced close - https://github.com/socketio/engine.io/blob/master/lib/socket.js

function onPacket(packet){ 
    if ('ping' == packet.type && 'probe' == packet.data) { 
     transport.send([{ type: 'pong', data: 'probe' }]); 
     self.emit('upgrading', transport); 
     clearInterval(self.checkIntervalTimer); 
     self.checkIntervalTimer = setInterval(check, 100); 
    } else if ('upgrade' == packet.type && self.readyState != 'closed') { 
     debug('got upgrade packet - upgrading'); 
     cleanup(); 
     self.upgraded = true; 
     self.clearTransport(); 
     self.setTransport(transport); 
     self.emit('upgrade', transport); 
     self.setPingTimeout(); 
     self.flush(); 
     if (self.readyState == 'closing') { 
     transport.close(function() { 
      self.onClose('forced close'); 
     }); 
     } 
    } else { 
     cleanup(); 
     transport.close(); 
    } 
    } 


Socket.prototype.close = function() { 
    if ('open' != this.readyState) return; 

    this.readyState = 'closing'; 

    if (this.writeBuffer.length) { 
    this.once('drain', this.closeTransport.bind(this)); 
    return; 
    } 

    this.closeTransport(); 
}; 

kapalı taşıma

Transport close (burada hiçbir sebep) - Bir istemci bağlantıyı paket var https://github.com/socketio/engine.io/blob/master/lib/socket.js

function cleanup() { 
    self.upgrading = false; 

    clearInterval(self.checkIntervalTimer); 
    self.checkIntervalTimer = null; 

    clearTimeout(self.upgradeTimeoutTimer); 
    self.upgradeTimeoutTimer = null; 

    transport.removeListener('packet', onPacket); 
    transport.removeListener('close', onTransportClose); 
    transport.removeListener('error', onError); 
    self.removeListener('close', onClose); 
    } 


    function onTransportClose(){ 
    onError("transport closed"); 
    } 

, bu yüzden 'kapanış' için soket durumunu değiştirme

Client namespace disconnect - Yoğun bir nedenlerinden https://github.com/socketio/socket.io/blob/master/lib/socket.js

Socket.prototype.onpacket = function(packet){ 
    debug('got packet %j', packet); 
    switch (packet.type) { 
    case parser.EVENT: 
     this.onevent(packet); 
     break; 

    case parser.BINARY_EVENT: 
     this.onevent(packet); 
     break; 

    case parser.ACK: 
     this.onack(packet); 
     break; 

    case parser.BINARY_ACK: 
     this.onack(packet); 
     break; 

    case parser.DISCONNECT: 
     this.ondisconnect(); 
     break; 

    case parser.ERROR: 
     this.emit('error', packet.data); 
    } 
}; 


Socket.prototype.ondisconnect = function(){ 
    debug('got disconnect packet'); 
    this.onclose('client namespace disconnect'); 
}; 

bir

Transport error - https://github.com/socketio/engine.io/blob/master/lib/socket.js

/** 
* Called upon transport error. 
* 
* @param {Error} error object 
* @api private 
*/ 

Socket.prototype.onError = function (err) { 
    debug('transport error'); 
    this.onClose('transport error', err); 
}; 

https://github.com/socketio/engine.io/blob/master/lib/transport.js

/** 
* Called with a transport error. 
* 
* @param {String} message error 
* @param {Object} error description 
* @api private 
*/ 

Transport.prototype.onError = function (msg, desc) { 
    if (this.listeners('error').length) { 
    var err = new Error(msg); 
    err.type = 'TransportError'; 
    err.description = desc; 
    this.emit('error', err); 
    } else { 
    debug('ignored transport error %s (%s)', msg, desc); 
    } 
}; 

onlar her yerden prizlere hataları atmak gibi görünüyor, bu nedenle nedenini bulmak tek yolu neyin neden olduğunu bulmak için hata açıklaması (çok fazla değil bilgi) okuma veya tüm arşivlerine bakarak gereğidir hata.

PD: Çok fazla hata var. `PingInterval` değerini artırarak Bence