2015-03-16 4 views
10

सॉकेट.io v1.2.1 (केवल "मतदान" परिवहन का उपयोग करके) का उपयोग करना, कभी-कभी मेरे क्लाइंट डिस्कनेक्शन का अनुभव करें।socket.io: डिस्कनेक्ट इवेंट - 'ट्रांसपोर्ट क्लोज़', 'क्लाइंट नेमस्पेस डिस्कनेक्ट', 'ट्रांसपोर्ट एरर' और 'मजबूर क्लोज़'

मेरे डिस्कनेक्ट इवेंट कॉलबैक फ़ंक्शन पर मुझे लगभग 50% समय ping timeout मिलता है, जो उचित है।

अन्य बार, मुझे transport close, client namespace disconnect, transport error और forced close मिलते हैं। मुझे दस्तावेज़ में उन डिस्कनेक्शन कारणों का कोई संदर्भ नहीं मिला, और कोड से उनके अर्थ को वास्तव में समझने में सक्षम नहीं था।

मैं यह सुनिश्चित करना चाहता हूं कि मैं प्रत्येक डिस्कनेक्शन को सर्वोत्तम तरीके से संभालता हूं (और शायद उन्हें रोक सकता हूं)।

शायद कोई इन कारणों से थोड़ा सा प्रकाश डाल सकता है।

उत्तर

0

दुर्भाग्यवश यह हो सकता है। कभी-कभी, जैसा कि मुझे सौदा करने के लिए दुर्भाग्य था, यह मेरे, सर्वर और अन्य क्लाइंट के बीच कहीं फ़ायरवॉल के कारण था।

पिंग के लिए टाइमआउट आप सर्वर साइड पर पिंग अंतराल को बढ़ाने के लिए

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

मेरी राय में, 'पिंगइंटरवाल' मान बढ़ाना केवल एक समाधान है, वास्तविक समाधान नहीं। यह उन ग्राहकों का कारण बन जाएगा जो वास्तव में कनेक्शन खो देते हैं जैसे कि वे अभी भी जुड़े हुए हैं। –

2

कोई प्रलेखन नहीं है की कोशिश कर सकते, यह कम या ज्यादा मैं क्या कोड से व्याख्या कर सकते हैं:

Forced close - सॉकेट समापन राज्य में है

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

परिवहन जहां बंद कर दिया (यहाँ कोई कारण नहीं)

Transport close - 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"); 
    } 

हम एक ग्राहक डिस्कनेक्ट पैकेट मिला है, इसलिए हम 'बंद करने' के लिए सॉकेट स्थिति परिवर्तित

Client namespace disconnect - 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'); 
}; 

पास परिवहन के कारणों में से एक

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

ऐसा लगता है जैसे वे हर जगह से सॉकेट करने के लिए त्रुटियों फेंक, इसलिए कारणों का पता लगाने के लिए एक ही रास्ता क्या खड़ी कर रहा है पता लगाने के लिए त्रुटि विवरण (बहुत ज्यादा नहीं जानकारी) पढ़ने या उनके सभी पुस्तकालयों की तलाश कर रहा है त्रुटि।

पीडी: बहुत सारी त्रुटियां हैं।

संबंधित मुद्दे