2015-06-03 10 views
12

के साथ कमरे में क्लाइंट को कैसे गिनें I1Socket.io का उपयोग करके कई नोड्स के साथ चैट सर्वर बनाना शुरू करें। मैसेजिंग के लिए सभी सर्वरों को जोड़ने और rooms कनेक्ट करने के लिए यह Socket.io-redis का उपयोग करता है।सॉकेट.ओओ: सॉकेट.ओ-रेडिस एडाप्टर

जब कोई ग्राहक सर्वर से कनेक्ट होता है तो मैं क्लाइंट में कुछ कमरे में शामिल होता हूं।

io.on('connection', function(socket){ 
    socket.join("CLIENT_1"); 
}); 

तो मैं, कमरे "CLIENT_1" से जुड़े ग्राहकों की संख्या प्राप्त करने

io.sockets.adapter.rooms["CLIENT_1"]; 

चाहते हैं, लेकिन मैं केवल मौजूदा प्रक्रिया से कनेक्शन मिलता है। मैं रेडिस एडाप्टर से जुड़े सभी सर्वर प्रक्रियाओं से कनेक्शन कैसे प्राप्त कर सकता हूं?

मैं इस सवाल के माध्यम से चले गए हैं:

How to check socket is alive (connected) in socket.io with multiple nodes and socket.io-redis

लेकिन यह मेरी मदद नहीं की।

अग्रिम के लिए धन्यवाद।

उत्तर

7

इस लेखन के रूप में:

  • onmessage
  • broadcast
  • add
  • del
  • :

    redis adapter extends the base adapter, लेकिन यह केवल ओवरराइड करता है/निम्नलिखित गुण जुड़ जाते हैं


आपके इस कोड के साथ

:

io.sockets.adapter.rooms["CLIENT_1"]; 

आप the rooms property जानना चाहते हैं। यह रेडिस एडाप्टर द्वारा ओवरराइड नहीं किया गया था, इसलिए आप वास्तव में बेस एडाप्टर से पूछताछ कर रहे हैं, जो केवल वर्तमान प्रक्रिया में कमरे/ग्राहकों के बारे में जानता है।

रेडिस एडाप्टर rooms संपत्ति को ओवरराइड क्यों नहीं किया? चूंकि उपर्युक्त सटीक कॉल हस्ताक्षर से मिलान करने के लिए, प्रत्येक बार संपत्ति तक पहुंचने पर सभी कमरों और कनेक्शन युक्त ऑब्जेक्ट बनाने के लिए रेडिस इंस्टेंस से पूछना होगा। अच्छा नही। (यह तब तक नहीं है जब तक आप ऑब्जेक्ट वैल्यू की गणना कैसे कर सकते हैं जब उनके मूल्य पूछे जाते हैं।)

यदि आप क्लस्टर में सभी प्रक्रियाओं में "CLIENT_1" कक्ष से कनेक्शन की संख्या प्राप्त करना चाहते हैं, तो आपके पास होगा इस तरह की एक विधि के साथ the adapter itself है कि कार्यक्षमता जोड़ने के लिए:

/** 
    * Count the number of connections in a room. 
    * 
    * @param {String} room id 
    * @param {Function} callback (optional) 
    * @api public 
    */ 

    Redis.prototype.numClients = function(room, fn){ ... } 

जिसमें आप redis डाटाबेस उदाहरण क्वेरी करेंगे।

आईएमओ, यह लागू करने के लिए सभी अन्य एडाप्टर के लिए बेस एडाप्टर इंटरफ़ेस का हिस्सा होना चाहिए।It's a common problem.

+1

अच्छा विचार है। धन्यवाद, मैं कोशिश करूँगा। –

+3

बैट, क्या आपने इसे काम किया है? – Geek4IT

1

इस विधि पूरी तरह से काम करता है:

io.sockets.adapter.clients(["room1"], function(err, clients){ 
    console.log("total clients in room1: %d", clients.length); 
}) 
संबंधित मुद्दे