2016-04-04 6 views
8

किसी विशिष्ट कमरे में संदेश भेजने का तरीका in Socket.io according to the docs वास्तव में सरल लगता है। निम्नलिखित कोड में कोई हैंडलर, एक बड़ा मॉड्यूल का हिस्सा है, लेकिन कार्यक्षमता सब सरल होना चाहिए, खासकर जब से मैं लॉग जो बेनकाब क्या प्रत्येक चर का प्रतिनिधित्व करता दिखा रहा हूँ:मेरे संदेश इस हैंडलर के साथ सॉकेट.ओ रूम में क्यों नहीं भेज रहे हैं?

module.exports.handle = function(client, data, socket, sessions, callback) { 
    debug.log('Client, ' + data.name + ' sent message:' + data.message); 
    debug.log(JSON.stringify(data, null, 3)); 
    var sessionId = data.code; 
    var name = data.name; 
    var room = JSON.stringify(socket.sockets.adapter.rooms[sessionId]); 
    debug.log('Socket.io Room: ' + room); 
    socket.to(sessionId).emit('receive message', { 
     name : data.name, 
     message : data.message, 
     sender : client.id 
    }); 
}; 

इसकी निम्नलिखित में स्पष्ट दिखाई देता है लॉग (पिछले कोड के आधार पर) कि जो कमरा मैं निर्दिष्ट करता हूं वह एक वैध सॉकेट.ओ कमरा है, इसलिए मुझे नहीं पता कि क्यों (इस उदाहरण में) .to('M57VUYD1') कमरे में संदेश भेजने में विफल रहा है। लॉग इन सत्यापित करते हैं कि M57VUYD1 इस मामले में एक मान्य कमरा है।

[Debug][Send Message Event Handler]: Client, Jonathan sent message:hey 
[Debug][Send Message Event Handler]: { 
    "message": "hey", 
    "name": "Jonathan", 
    "code": "M57VUYD1" 
} 
[Debug][Send Message Event Handler]: Socket.io Room: {"sockets":{"57VUYD1":true,"D4N178C":true},"length":2} 

क्या इस मॉड्यूल के साथ उम्मीद में काम करने के लिए कुछ गलत है? या मैंने सही वाक्यविन्यास का उपयोग किया है?

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

मैं GitHub पर और अधिक विस्तार में इस समस्या को कहा: https://github.com/socketio/socket.io/issues/2518

+0

ताकि कमरे के नाम 'M57VUYD1' और सॉकेट आईडी '57VUYD1' की समानता से कोई भी भ्रमित न हो, मैं समझाऊंगा: 57VUYD1 वह आईडी है जिसे मैंने उस उपयोगकर्ता के लिए परिभाषित किया है जो कमरे बनाने के लिए होता है, और मैंने निर्माता 'आईडी' के साथ कमरे का नाम दिया, पत्र 'एम' को छोड़कर (क्योंकि आप एक व्यक्ति के रूप में एक ही आईडी के साथ एक कमरे का नाम नहीं दे सकते हैं, क्योंकि सॉकेट.io की एक विशिष्ट उपयोगकर्ता मैसेजिंग की डिफ़ॉल्ट विधि सभी उपयोगकर्ताओं को शामिल करके काम करती है अपने नाम के साथ एक नया कमरा, और आप '.to()' विधि के साथ उस कमरे में संदेश भेजने के वाक्यविन्यास का उपयोग करते हैं।) –

+0

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

उत्तर

0

आप के नाम बदलने (जो यह मुश्किल एक सा लगता है के लिए बनाता है), ऐसा लगता है आप 2 कनेक्शन है कि सभी सहित क्या कहा, के आधार पर: 57VUYD1 जो सर्वर प्रतीत होता है, और D4N178C जो मैं अनुमान लगा रहा हूं वह ग्राहक है। इसलिए M57VUYD1 से कनेक्ट करने का प्रयास करने से बहुत कुछ नहीं होगा।

बजाय ग्राहक के पते पर भेजने का प्रयास करें:

socket.to('D4N178C').emit('receive message', { 
    name : data.name, 
    message : data.message, 
    sender : client.id 
}); 

यह 57VUYD1 बजाय D4N178C हो सकता है, के रूप में मुझे यकीन है कि कैसे आप चीजों को परिभाषित किया है नहीं कर रहा हूँ।

मुझे यह भी सुनिश्चित नहीं है कि आपने कितने चर को असाइन किया है जो आपको D4N178C प्राप्त करने देगा, लेकिन आप इसे ऊपर .to() में जो कुछ भी काम कर सकते हैं उसे काम कर सकते हैं और काम करना चाहिए।

+0

आपने मुझे खो दिया। Socket.io में कमरे के सदस्यों की सूची में क्लाइंट और सर्वर क्यों है? वे सभी ग्राहक हैं ... सर्वर वह कोड है जिसे आप देख रहे हैं। शायद मैंने आपको गलत समझा .. –

+0

'M57VUYD1' कमरे का नाम है .. –

+0

क्या आपने उन दोनों आईडी के साथ प्रयास किया है? – tyler

3

उत्तर यह है: सॉकेट.ओओ में सॉकेट आईडी बदलना, जैसा कि मैंने स्टैक ओवरफ़्लो पर सीखा है, लेकिन कुछ मुझे नहीं पता था कि ऐसा करने से अज्ञात तरीकों से सॉकेट.io टूट जाएगा। उन तरीकों में से एक है: कक्ष प्रणाली अब काम नहीं करेगी।

दूसरे शब्दों में, सॉकेट आईडी को अपने स्वयं के चयन में परिवर्तित न करें, ऐसा करने से लाइब्रेरी द्वारा समर्थित नहीं है।

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