socket.io कमरे या नाम स्थान?


163

मैं वास्तविक समय चैट के लिए नोडज / सॉकेट.आईओ की जांच कर रहा हूं, और मुझे कमरों को लागू करने के लिए कुछ सलाह की आवश्यकता है।

जो बेहतर है, नेमस्पेस का उपयोग करते हुए या कमरे की सुविधा का उपयोग करते हुए एक दूसरे से चैटर्स के अंगूर को पूरी तरह से अलग करने के लिए?

कमरे और नाम स्थान के बीच वास्तविक तकनीकी अंतर क्या है?

क्या कोई संसाधन उपयोग अंतर है?

जवाबों:


216

यह वही है जो नाम स्थान और कमरे में सामान्य है (सॉकेट.आईओ v0.9.8 - कृपया ध्यान दें कि v1.0 में एक पूर्ण पुन: लिखना शामिल है, इसलिए चीजें बदल सकती हैं):

  • दोनों नेमस्पेस ( io.of ('/ nsp') ) और कमरे ( सॉकेट.जॉइन ('रूम') ) सर्वर साइड पर बनाए गए हैं
  • कई नामस्थान और कई कमरे एक ही (WebSocket) कनेक्शन साझा करते हैं
  • सर्वर तार पर केवल उन ग्राहकों को संदेश प्रसारित करेगा जो nsp / कमरे से जुड़े / जुड़े हुए हैं, अर्थात यह केवल क्लाइंट-साइड फ़िल्टरिंग नहीं है

मतभेद :

  • नेमस्पेस ग्राहक द्वारा उपयोग किए जाने से जुड़े हुए हैं io.connect(urlAndNsp)(क्लाइंट को उस नेमस्पेस में तभी जोड़ा जाएगा जब यह सर्वर पर पहले से मौजूद हो)
  • कमरे केवल सर्वर साइड से जुड़ सकते हैं (हालाँकि क्लाइंट साइड को जोड़ने के लिए सर्वर साइड पर एक एपीआई बनाना सीधा है)
  • नेमस्पेस को प्राधिकरण संरक्षित किया जा सकता है
  • प्राधिकरण कमरों के साथ उपलब्ध नहीं है , लेकिन कस्टम प्राधिकरण को सर्वर पर उपरोक्त, आसान-टू-क्रिएट एपीआई में जोड़ा जा सकता है, यदि कोई कमरे का उपयोग करने पर तुला है
  • कमरे एक नाम स्थान का हिस्सा हैं ('वैश्विक' नामस्थान के लिए डिफ़ॉल्ट)
  • नाम स्थान हमेशा वैश्विक दायरे में निहित होते हैं

नाम (कमरे या नाम स्थान) के साथ अवधारणा को भ्रमित न करने के लिए, मैं अवधारणा का उल्लेख करने के लिए डिब्बे का उपयोग करूंगा , और अवधारणा के कार्यान्वयन के लिए अन्य दो नाम । तो फिर आप

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

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

वास्तव में इसे बेंचमार्क नहीं किया गया है, यह मुझे लगता है कि अगर आपको अलग और समूह संदेशों के लिए अपनी परियोजना में सरल डिब्बों की आवश्यकता है, तो दोनों में से कोई एक ठीक है।

निश्चित नहीं है कि यह आपके प्रश्न का उत्तर देता है, लेकिन इस उत्तर के लिए अग्रणी शोध ने मुझे स्पष्ट रूप से देखने में मदद की।


5
क्या सॉकेट.आईओ संस्करण> = 1.0 के बाद इस पर कोई बड़ा बदलाव आया है?
ज़ेरॉक्सॉइड

2
पिछले संस्करण में परिवर्तन, पढ़ socket.io/docs/rooms-and-namespaces और इस उत्तर के कमरे बातों को समझने के लिए उपयोगी हो सकता है stackoverflow.com/questions/24041220/...
गोंजालो Bahamondez

1
क्या हम कह सकते हैं कि नाम स्थान मेरे वेब ऐप का एक निश्चित क्षेत्र है और उस क्षेत्र में ग्राहकों का एक समूह है?
ओनागैगैक

क्या आप किसी कमरे / नाम स्थान से डिस्कनेक्ट करते समय कुछ जोड़ सकते हैं। जब क्लाइंट डिस्कनेक्ट या अस्थायी रूप से कनेक्शन खो देता है तो उनके साथ क्या होता है। यहां लिखा गया है: वियोग के बाद, सॉकेट उन सभी चैनलों को छोड़ देता है जो वे स्वचालित रूप से थे, और आपके हिस्से पर विशेष रूप से फाड़ की आवश्यकता नहीं है। क्या एक चैनल आपके कंपार्टमेंट जैसा ही है ?
विल्ट

67

यह एक पुराना प्रश्न है लेकिन इस विषय पर कुछ शोध करने के बाद मुझे पता चला कि एक महत्वपूर्ण बिंदु पर स्वीकृत उत्तर स्पष्ट नहीं है। खुद गिलर्मो राउच के अनुसार ( लिंक देखें ): हालाँकि यह एक रनिंग ऐप पर गतिशील रूप से नेमस्पेस बनाने के लिए सैद्धांतिक रूप से संभव है कि आप उन्हें मुख्य रूप से आप के पूर्वनिर्धारित अलग-अलग वर्गों के रूप में उपयोग करें। यदि, दूसरी ओर आपको उपयोगकर्ताओं / समूहों के समूहों को समायोजित करने के लिए, मक्खी पर, तदर्थ डिब्बों को बनाने की आवश्यकता है, तो कमरे का उपयोग करना सबसे अच्छा है।


3
पसंद है! नाम स्थान - पूर्वनिर्धारित कनेक्शन। कमरे - डायनामिक कनेक्शन
नंदकुमार

16

यह निर्भर करता है कि आप क्या करना चाहते हैं।

मुख्य अंतर यह है कि कमरों को लागू करना कठिन है। आपको प्रत्येक पृष्ठ पुनः लोड वाले कमरों में शामिल होने के लिए एक विधि बनानी होगी।

नामस्थानों के साथ आपको बस var example = io.connect('http://localhost/example');अपने जावास्क्रिप्ट क्लाइंट में लिखना होगा और क्लाइंट को स्वचालित रूप से नामस्थानों में जोड़ दिया जाएगा।

उपयोग का उदाहरण:

  • कमरे: निजी चैट।
  • नामस्थान: पृष्ठ की चैट।

2

कमरे और नाम स्थान खंड संचार और समूह व्यक्तिगत सॉकेट।

एक कमरे में या एक नामस्थान पर प्रसारण सभी सदस्यों तक नहीं पहुंचेगा।

नाम स्थान और कमरे के बीच का अंतर निम्नलिखित है:

  • Namespaces: frontend में प्रबंधित हैं जिसका अर्थ है कि उपयोगकर्ता, या एक हमलावर, frontend के माध्यम से जुड़ता है और जुड़ने और डिस्कनेक्ट करने का प्रबंधन यहाँ किया जाता है।
  • कमरे: बैकएंड में प्रबंधित होते हैं, जिसका अर्थ है कि सर्वर जुड़ने और कमरों को छोड़ने का काम करता है।

अंतर मुख्य रूप से है जो उन्हें प्रबंधित करता है

यह तय करने के लिए कि आपको क्या उपयोग करना है, यह तय करना चाहिए कि क्या विभाजन को फ्रंटएंड या बैकएंड में प्रबंधित किया जाना चाहिए


0

नाम स्थान आपको एक ही नाम से ऑब्जेक्ट बनाने की अनुमति देता है, लेकिन वे अलग-अलग होंगे क्योंकि वे अलग-अलग नामस्थानों में रहेंगे, अन्यथा स्कोप के रूप में जाना जाता है।

यह वही विचार प्रक्रिया है जो आपके पास सॉकेट.आईओ नामस्थानों के साथ होनी चाहिए। यदि आप एक मॉड्यूलर नोड वेब एप्लिकेशन का निर्माण कर रहे हैं, तो आप अलग-अलग मॉड्यूलों को नाम स्थान देना चाहेंगे। यदि आप हमारे नाम स्थान कोड को देखते हैं, तो आप देखेंगे कि हम विभिन्न नामस्थानों में समान घटनाओं को सुनने में सक्षम थे। Socket.IO में, डिफ़ॉल्ट कनेक्शन पर कनेक्शन घटना और / xxx नाम स्थान पर कनेक्शन घटना अलग-अलग हैं। उदाहरण के लिए, यदि आपके पास आपकी साइट पर एक चैट और टिप्पणी प्रणाली है और दोनों वास्तविक समय चाहते हैं, तो आप प्रत्येक को नाम स्थान दे सकते हैं। यह आपको एक संपूर्ण सॉकेट.आईओ एप्लिकेशन बनाने की अनुमति देता है जो केवल अपने संदर्भ में रहता है।

यह भी सच होगा यदि आप किसी ऐसी चीज़ का निर्माण कर रहे हैं जिसे पैक और स्थापित किया जाना है। आप नहीं जान सकते कि कोई व्यक्ति पहले से ही डिफ़ॉल्ट नामस्थान में कुछ घटनाओं का उपयोग कर रहा है, इसलिए आपको अपना स्वयं का निर्माण करना चाहिए और वहां सुनना चाहिए। यह आपको किसी भी डेवलपर के पैर की उंगलियों पर कदम नहीं रखने देता है जो आपके पैकेज का उपयोग करता है।

Namespaces हमें विभिन्न संदर्भों में कनेक्शन बनाने की अनुमति देते हैं। हम इसकी तुलना कमरे से कर सकते हैं, जो हमें एक साथ समूह कनेक्शन की अनुमति देते हैं। फिर हम उसी कनेक्शन को अन्य कमरों में भी शामिल कर सकते हैं।

Namespaces आपको Socket.IO के लिए अलग-अलग संदर्भ बनाने की अनुमति देता है। कमरे में काम करने के लिए अनुमति देता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.