2011-06-08 21 views
6

मैं socket.io और node.js. के साथ काम कर रहा हूं। सॉकेट आईओ को पहचानने से पहले कुछ सेकंड देरी की वजह से मुझे कौन से उपयोगकर्ता ऑनलाइन हैं, यह ट्रैक करने में समस्याएं आ रही हैं IOR-Polling क्लाइंट डिस्कनेक्ट हो गया है।सॉकेट.आईओ: डिस्कनेक्शन पर एक्सएचआर-मतदान विलंब

यदि कोई एक्सएचआर-मतदान क्लाइंट पृष्ठ को रीफ्रेश करता है तो उनका नया कनेक्शन संदेश उनके डिस्कनेक्शन संदेश से पहले प्रतीत होता है। यह ट्रैक करने का प्रयास करते समय भ्रम पैदा करता है कि कौन से उपयोगकर्ता ऑनलाइन हैं।

एक समाधान सर्वरसाइड पर परिवहन विधि का पता लगाने और XHR-Polling क्लाइंट के कनेक्शन को देरी करने के लिए हो सकता है ताकि यह सुनिश्चित किया जा सके कि डिस्कनेक्शन फ़ंक्शंस पहले चलाए जा सकें।

क्या किसी के पास इसका कोई अनुभव है?

+2

डिस्कनेक्ट ईवेंट निकाल दिए जाने तक आप केवल उपयोगकर्ता को ऑनलाइन क्यों नहीं मान सकते हैं। मैं मानता हूं कि आपके पास एक ओवरलैप होगा जहां यह दिखाई देगा कि दो उपयोगकर्ता ऑनलाइन हैं जब केवल एक ही है, लेकिन यदि आप कुछ उपयोगकर्ता आईडी के अनुसार कनेक्शन की पहचान करते हैं तो कोई समस्या नहीं होनी चाहिए। और यदि नहीं, तो कुछ अतिरिक्त सेकंड के लिए उपयोगकर्ता को ऑनलाइन दिखाई देने वाला सबसे खराब केस परिदृश्य होता है। मुझे नहीं लगता कि विलंब जोड़ना अच्छा डिस्कनेक्शन पहचान करने के लिए एक विशेष रूप से ठोस तरीका है। – davin

+0

मैं डेविन से सहमत हूं।मैं उन लोगों का उपयोग करता हूं, "यह व्यक्ति ऑनलाइन है" जैसा कि अनुमान लगाया गया है कि व्यक्ति सही है, कानून के रूप में नहीं। अगर मैं जानना चाहता हूं कि वे क्या कर रहे हैं तो मैं उन्हें बुलाऊंगा। – jcolebrand

+0

यह कुछ है जिसे हमने [पुशर] (http://pusher.com) में समर्थन जोड़ा है और हम इसे [उपस्थिति चैनल] (http://pusher.com/docs/presence) नामक किसी चीज़ का उपयोग करते हैं। – leggetter

उत्तर

3

उपस्थिति के साथ मुख्य समस्या, @davin और @jcolebrand टिप्पणियों में बताती है कि अकेले कनेक्शन पर भरोसा नहीं किया जा सकता है। उपयोगकर्ता द्वारा किसी पृष्ठ से दूर जाने के बाद नेटवर्क डिवाइस कनेक्शन पर हो सकते हैं। इसलिए, उपयोगकर्ताओं की उपस्थिति की पुष्टि करने के लिए आपको कुछ और जगह चाहिए।

यह कुछ है जिसे हमने Pusher में समर्थन जोड़ा है और हम Presence Channels नामक किसी चीज़ का उपयोग करके ऐसा करते हैं।

हम इसे एक अद्वितीय उपयोगकर्ता आईडी का उपयोग करके प्रबंधित करते हैं, जिसे आप (डेवलपर) को एक अद्वितीय सॉकेट आईडी के साथ संयोजन में जोड़ते समय आपूर्ति करते हैं, जो कनेक्शन की पहचान करता है। चूंकि यह अद्वितीय उपयोगकर्ता आईडी केवल उपस्थिति सदस्य सूची में ही हो सकती है, इसका मतलब है कि वह उपयोगकर्ता केवल एक बार सूचीबद्ध होगा - भले ही उनके पास एकाधिक कनेक्शन खुले हों, और इस प्रकार एकाधिक सॉकेट कनेक्शन हों।

समान विचार HTTP कनेक्शन पर लागू किया जा सकता है।

इस के लिए सामान्य दृष्टिकोण उपयोगकर्ता को विशिष्ट रूप से पहचानने के लिए सत्र का उपयोग करना है। इस तरह से अगर वे सिर्फ "अतिथि" हैं, तब भी आप उन्हें तब तक पहचान सकते हैं जब तक वे कुकीज़ के उपयोग की अनुमति दे रहे हों।

तो, आपके सिस्टम पर उपयोगकर्ताओं की संख्या केवल आपके सर्वर पर चल रहे सक्रिय सत्रों की संख्या पर अधिकतम होनी चाहिए।

उम्मीद है कि इससे मदद मिलती है। अगर आप कुछ भी स्पष्ट करना चाहते हैं तो मुझे बताएं।

1

मैं चैट समर्थन समाधान विकसित कर रहा हूं और उपस्थिति को पता होना चाहिए कि ग्राहक कब कनेक्ट होता है। Websocket के साथ ठीक काम करता है, लेकिन whr-pooling के साथ, कभी-कभी उपस्थिति बस डिस्कनेक्ट (कुछ मामलों में 5 सेकंड के साथ)। कभी-कभी heppend नहीं है। मैं क्या करता हूं: मैं बस पृष्ठ दर्ज करता हूं और टर्मिनल ऐप को देखने का इंतजार करता हूं।

मैं NodeJS उपयोग कर रहा हूँ,

1

socket.io का कौन-सा संस्करण उपयोग कर रहे हैं nowjs? मुझे इस मुद्दे का सामना करना पड़ा और इसे on this post हल किया। यह पता चला है कि beforeunload इवेंट ट्रिगर होने पर भेजे गए अनुरोध पर socket.io 0.9.5 में एक बग पेश किया गया था जो उचित डिस्कनेक्शन को रोकता था।

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