2015-05-25 11 views
21

सॉकेट.io में, आप आमतौर पर सर्वर पक्ष पर एक विशिष्ट वाक्यविन्यास का उपयोग करते हैं यदि आप किसी विशिष्ट कमरे में संदेश भेजना चाहते हैं: io.to(room).emit('event', 'message');socket.io: विशिष्ट कमरे (क्लाइंट साइड) को संदेश भेजें

लेकिन क्लाइंट (मेरा मतलब है कि ब्राउज़र में सॉकेट.ओ-संबंधित कोड चल रहा है) इंगित करता है कि एक संदेश किसी विशिष्ट कमरे में जाना चाहिए?

यह आम बस कुछ इस तरह बनाने के लिए है (निश्चित रूप से सर्वर यह मूल्यांकन करने के लिए है):

socket.emit('chat message', {room: 'abc', msg: 'hello there'}); 

या socket.io क्लाइंट-साइड लाइब्रेरी के साथ-साथ इस उद्देश्य के लिए एक विशिष्ट वाक्यविन्यास की पेशकश करता है ?

संपादित करें: स्पष्टीकरण के लिए, ऊपर से मेरा सुझाव काम करने लगता है, मुझे यकीन नहीं है कि कोई बेहतर समाधान है या नहीं।

+0

कमरे और नाम स्थान के उपयोग AFAIK socket.io सिफारिश है http://socket.io/docs/server-api/ http: // socket.io/docs/rooms-and-namespaces/ – Pogrindis

+0

वे 'मल्टीप्लेक्सिंग', http: // सॉकेट का उपयोग करने का सुझाव दे रहे हैं।io/docs/# restricting-yourself-to-a-namepace हालांकि यह 'नेमस्पेस' के लिए 'कमरे' नहीं है, लेकिन यह समान परिदृश्य में मदद कर सकता है। – Ankit

+0

@Pogrindis धन्यवाद, मुझे इसके बारे में पता है और मैं सर्वर की तरफ कमरे की अवधारणा का उपयोग करता हूं। मुझे डर है कि मेरा सवाल पर्याप्त स्पष्ट नहीं है। मैं सोच रहा हूं कि क्लाइंट-साइड ऐप (उदा। सॉकेट.ओओ का उपयोग कर एक angular.js आधारित चैट) socket.io सर्वर को बता सकता है कि किस कमरे में एक संदेश जाना चाहिए। – alapeno

उत्तर

17

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

+0

विस्तृत उत्तर, गेब्रियल के लिए धन्यवाद। तो मैं गलत नहीं था। – alapeno

1

अलापेनो का समाधान क्लाइंट के लिए सर्वर के संदेश डेटा के हिस्से के रूप में एक विशिष्ट कमरा भेजने के लिए था, ताकि सर्वर को पता चले कि संदेश किस प्रसारण को प्रसारित करता है।

हालांकि, अगर आप सिर्फ ग्राहक अपने स्वयं के कमरे करने के लिए एक संदेश भेजना चाहते हैं, तो आपको सर्वर socket.rooms वस्तु के माध्यम से अपने आप ही ग्राहक के कमरे से पता लगा सकता। इस प्रकार, आपको संकेत के अनुसार संदेश के हिस्से के रूप में ग्राहक को अपने कमरे का नाम भेजने की आवश्यकता नहीं होगी।

Client.js:

socket.emit('chat message', 'hello'); 

Server.js:

socket.on('chat message', function(msg){ 
    var keys = Object.keys(socket.rooms); 
    for (var i = 0; i < keys.length; i++) { 
     io.to(socket.rooms[keys[i]]).emit('chat message', msg); 
    } 
}); 

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

उदाहरण:

socket.rooms[keys[0]]) = WMWlX-ekAxa8hP8FAAAE

socket.rooms[keys[1]]) = app-chat-room

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