2012-10-10 14 views
14

में क्लाइंट से दिल की धड़कन टाइमआउट को नियंत्रित करना मेरे पास मोबाइल क्लाइंट node.js सर्वर से जुड़े हैं, xhr-polling के माध्यम से socket.io चला रहे हैं। मैं ग्राहकों के दो प्रकार है:socket.io

  • टाइप ए

    जब कनेक्शन ( ग्राहक दुर्घटनाओं या कि) नेटवर्क समस्याओं के कारण को तोड़ता डिफ़ॉल्ट दिल की धड़कन टाइमआउट बहुत लंबा है

  • टाइप बी

    जब कनेक्शन इस क्लाइंट के लिए टूट जाता है तो मुझे इसे पुनर्प्राप्त करने के लिए अधिक समय देने की आवश्यकता होती है - यह अधिक महत्वपूर्ण है कि क्लाइंट से ठीक हो जाए सर्वर कनेक्शन/सत्र

तो मेरे सवाल है कि कैसे मैं कॉन्फ़िगर करने के लिए (अगर यह संभव हो सकता है) वास्तविक ग्राहक से दिल की धड़कन समय समाप्ति टूट जाता है?

+1

दिल की धड़कन के समय के बारे में निश्चित नहीं है, लेकिन यदि आप सॉकेट.ओ-क्लाइंट का उपयोग कर रहे हैं तो कुछ उपयोगी विकल्प हैं जो आपकी मदद कर सकते हैं, जैसे 'कनेक्ट टाइमआउट' 'रिकनेक्शन देरी '' अधिकतम पुन: कनेक्शन प्रयास' – vinayr

उत्तर

42

जहाँ तक मैं कह सकता हूं, यहां 2 मूल्य हैं जो यहां मायने रखते हैं: सर्वर प्रत्येक heartbeat interval सेकंड क्लाइंट को दिल की धड़कन भेजता है; यदि कोई प्रतिक्रिया नहीं है, तो क्लाइंट सीधे जवाब देता है, सर्वर तय करता है कि ग्राहक मर चुका है। ग्राहक पिछले दिल की धड़कन के बाद heartbeat timeout सेकंड के लिए सर्वर से दिल की धड़कन की प्रतीक्षा करता है (जो स्पष्ट रूप से heartbeat interval से अधिक होना चाहिए)। यह heartbeat timeout सेकंड में सर्वर से शब्द प्राप्त नहीं हुआ है, तो यह मान लिया गया है सर्वर मर चुका है (और अन्य विकल्पों आप निर्धारित किया है के आधार पर पुन: कनेक्ट डिस्कनेक्ट करने शुरू कर देंगे /।

डिफ़ॉल्ट मान heartbeat interval = 25s और heartbeat timeout = 60s कर रहे हैं। दोनों आइटम हैं । सर्वर पर सेट, heartbeat timeout जोड़ने पर ग्राहक के लिए भेज दिया जाता है

एक भी ग्राहक के लिए heartbeat timeout बदलने आसान है:

var socket = io.connect(url); 
socket.heartbeatTimeout = 20000; // reconnect if not received heartbeat for 20 seconds 
हालांकि सर्वर पर

, heartbeat interval मूल्य हिस्सा प्रतीत हो रहा है किसी साझा ऑब्जेक्ट (प्रबंधक, जो आपको अपने var io = require("socket.io").listen(server) कॉल से वापस मिलता है) का अर्थ है, जिसका अर्थ यह है कि इसे व्यक्तिगत सॉकेट के लिए आसानी से बदला नहीं जा सकता है।

मुझे यकीन है कि कुछ के साथ socket.io हैकिंग आप इसे ऐसा करने के लिए सक्षम होना चाहिए हूँ, लेकिन आप इस प्रक्रिया में अन्य सामान तोड़ सकता ...

+0

धन्यवाद .. बहुत उपयोगी जवाब वास्तव में – Charmie

+1

भयानक उत्तर ..... मैं 100 वोट अप देना चाहता हूं..धन्यवाद .... बहुत .. –

+2

बल्कि http://stackoverflow.com/a/31146441/671457 @ जोसेफ 238 के उत्तर को देखें यदि आप ' मेरे जैसे भविष्य से। – Capaj

11

क्लाड के जवाब पूरा करने के लिए, आप इन मूल्यों को सेट कर सकते हैं सर्वर लीवर में, निम्न कोड के साथ

io.set('heartbeat interval', 5); 
io.set('heartbeat timeout', 11); 

और फिर आप 2 Node.js सर्वर, ग्राहक (ए और बी) के प्रत्येक प्रकार के लिए एक, विकल्प (दिल की धड़कन टाइमआउट और अंतराल के 2 वांछित सेट होने बना सकते हैं)।

+0

क्या यह कहीं भी किसी दस्तावेज़ में पाया जा सकता है? – youbetternot

+1

दुर्भाग्यवश, मुझे यह किसी दस्तावेज़ में नहीं मिला है, जो कि वैसे भी छोटा है। लेकिन व्यावहारिक रूप से मैंने उपरोक्त कोड का उपयोग करके देखा है, मूल्य वास्तव में बदल जाते हैं। – radu122

+1

यह उत्तर socket.io 0.9 के लिए मान्य है। *। Socket.io/lib/master.js में प्रलेखन। –

14

सॉकेट.io 1.x में, एपीआई बदल गई है लेकिन अवधारणा वही बना है।

दिल की धड़कन के बजाय अंतराल और दिल की धड़कनटाइमआउट, गुण पिंग इंटरवल और पिंगटाइमआउट हैं। उदाहरण के लिए,

var server = app.listen(80); 
io = socketio(server,{'pingInterval': 45000}); 

http://socket.io/docs/server-api/#server(opts:object) पर दस्तावेज़, जो आप https://github.com/Automattic/engine.io#methods-1 को निर्देशित करेंगे देखें।