2014-04-13 4 views
5

मैं मल्टीप्लेयर कार्ड गेम के लिए सॉकेट.ओ के साथ नोड.जेएस का उपयोग कर रहा हूं, और ऐसे गेम रूम हैं जो खिलाड़ी शामिल हो सकते हैं।सॉकेट दिए गए कमरे में एक लाइन की जांच करें?

एक कमरे में शामिल होने के लिए, मैं बस का उपयोग करें:

io.sockets.on('connection', function (socket) { 
    socket.on('joinRoom', function (gid) { 
     //gid is game ID - create room name based on this and join the room 
     var room = 'game'+gid; 
     socket.join(room); 
    }); 
}); 

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

if(socket with ID "z8b7dbf98i" is in room "game10") 
    //do something 
+0

इसे आज़माएं 'अगर (_। है (io.sockets.adapter.rooms [RoomId], socket.id)) ' –

+0

इसे भी देखें: https://stackoverflow.com/questions/19044660/socket-io -जेट-रूम-जो-सॉकेट-वर्तमान में – PallavBakshi

उत्तर

8

दस्तावेज़ीकरण के लिए हो सकता है, socket.io कि करने के लिए कोई आसान तरीका है करने के लिए प्रतीत नहीं होता। आपको वास्तव में यह जांचने की आवश्यकता है कि क्लाइंट रूम सरणी में है या इसके विपरीत: यदि कमरा क्लाइंट सरणी में है।

यह indexOf का उपयोग कर एक oneliner साथ किया जा सकता:

if(socket.rooms.indexOf(room) >= 0) 

या विपरीत खोज:

if(io.sockets.manager.rooms['/' + room].indexOf(socket.id) >= 0) 
+0

में ध्यान दें कि एकाधिक नोड्स को सिंक करने के लिए रेडिस का उपयोग करते समय एपीआई अलग है (async): https://github.com/socketio/socket.io-redis#redisadapterclientsroomsarray- fnfunction –

2

वर्तमान socket.io (1.0+ मुझे लगता है) io वस्तु की संरचना के लिए बदल गया था, इसलिए अब आप पता लगा सकते हैं कि socketid दिए गए सॉकेट roomid के साथ कमरे में

if(io.sockets.adapter.rooms[roomid][socketid])

+2

यह फिर से बदल गया है, अब आपको '' '' (io.sockets.adapter.rooms [data.groupId] .sockets [socket.id] की आवश्यकता है) '' – Ryan

0

आप अभी भी इसे की जरूरत है आप आगे क्या कर सकते हैं:

socket.room = "someRoom"; 

और फिर बस इसे की जाँच करें:

if (socket.room !== undefined){ 
     socket.leave(socket.room); 
    } 
+0

कृपया अंतिम '} 'इंडेंट करके अपना स्वरूपण ठीक करें। – YakovL

1

यह लगता है सॉकेट के संस्करणों के साथ काफी एक बहुत कुछ बदल दिया है। io, लेकिन इस लेखन के रूप में (संस्करण 1.7.2), ऐसा लगता है कि यह socket.rooms में संग्रहीत है। यह एक वस्तु है कि इस तरह दिखाई देता है:

{ 
    room_name: 'room_name', 
    second_room_name: 'second_room_name', 
    ... 
} 

से पहले अपने सॉकेट किसी भी कमरे में शामिल हो गया, के रूप में दस्तावेज, आप देखेंगे कि सॉकेट उसके अपने आईडी के साथ एक कमरे, इसलिए socket.rooms कुछ ऐसी दिखाई देगी में पहले से ही है:

{ PxtiIs22S7GhWPTSAAAA: 'PxtiIs22S7GhWPTSAAAA'} 

इसका मतलब है कि आप देख सकते हैं कि एक सॉकेट इस तरह एक कमरे में कुछ है:

io.on('connection', function(socket){ 
    if(socket.rooms[myRoomName]){ 
    // in the room 
    }else{ 
    // not in the room 
    } 
}); 
+0

लगता है कि कमरे के नाम ** PxtiIs22S7GhWPTSAAAA ** में परिवर्तित हो गए हैं। चलिए कहते हैं कि एक ग्राहक कमरे के नाम में शामिल हो गया ** सत्र-प्रारंभ **। इसे {PxtiIs22S7GhWPTSAAAA: 'PxtiIs22S7GhWPTSAAAA'} के रूप में संग्रहीत किया जाएगा। तो सादे कमरे के नाम भी पाने का कोई तरीका नहीं है। यदि मैं गलत हूं तो मुझे सही करों। –

4

आप बस इस
0,123,516 तरह जाँच कर सकते हैंio.sockets.adapter.rooms['roomId']

यह आपको एसआईडी के साथ एक वस्तु देता है उदा।
{"1sEAEIZeuMgdhF35AAAA":true}


अपडेट विशिष्ट संस्करणों में:

1।4:

io.sockets.adapter.rooms['roomId'] 

1.3.x:

io.adapter.rooms['roomId']; 


अपडेट::
हालांकि एक जाँच कर सकते हैं सॉकेट आईडी

io.sockets.adapter.rooms['roomId']; 

1.0.x 1.2.x करने के लिए दिए गए कमरे में है या ऊपर वर्णित एक पंक्ति के साथ नहीं है अगर सर्वर आर्किटेक्चर में एकल नोड सर्वर है/एकल नोड प्रक्रिया।

यदि आप multi-node server का उपयोग कर रहे हैं, यानी लोड संतुलित के साथ अलग नोड प्रक्रिया।

यहां ध्यान दें कि सॉकेट केवल उस प्रक्रिया पर पंजीकृत हैं जो उन्होंने पहले कनेक्ट किया था। इसलिए, आपको अपने सभी नोड्स को ईवेंट सिंक करने के लिए socket.io-redis का उपयोग करने की आवश्यकता है, और मल्टी नोड में सॉकेट आईडी की सूची को बनाए रखने के लिए आप क्या कर सकते हैं, प्रत्येक बार क्लाइंट कनेक्ट/डिस्कनेक्ट होने पर एक ईवेंट प्रसारित करता है, ताकि प्रत्येक नोड & बनाए रखता है सभी ग्राहकों/सॉकेट आईडी की वास्तविक समय सूची।

पृष्ठभूमि/विवरण:
redis एडाप्टर base adapter फैली हुई है, लेकिन यह केवल overrides/adds the following properties:
ग्राहकों प्रसारण जोड़ने डेल delAll

निम्नलिखित कोड के साथ:

io.sockets.adapter.rooms["roomId"]; //Any of the above examples specific to versions mentioned above 

आप हैं socket.io-redis एडाप्टर पर कमरे की संपत्ति पूछताछ। यह रेडिस एडाप्टर द्वारा ओवरराइड नहीं किया गया था, इसलिए आप वास्तव में बेस एडेप्टर से पूछताछ कर रहे हैं, जो केवल वर्तमान प्रक्रिया में कमरे/ग्राहकों के बारे में जानता है।

रेडिस एडाप्टर कमरे की संपत्ति को ओवरराइड क्यों नहीं किया? हो सकता है क्योंकि इस संपत्ति के हर एक्सेस पर सभी कमरों और कनेक्शन वाले ऑब्जेक्ट को बनाने के लिए इसे रेडिस डेटाबेस इंस्टेंस से पूछना होगा। अच्छा विचार नहीं?

तो इस लेखन जवाब के रूप में आप इस तरह एक विधि के साथ एडाप्टर ही है कि कार्यक्षमता जोड़ने के लिए होगा:

/** 
    * One-Line code/property to check if the socket id is in given room. 
    * 
    * @param {String} room id 
    * @param {Function} callback (optional) 
    * @api public 
    */ 

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

जहां redis डेटाबेस उदाहरण मारा जाएगा।

यह लागू करने के लिए सभी अन्य एडाप्टर के लिए बेस एडाप्टर इंटरफ़ेस का हिस्सा होना चाहिए। यह एक आम समस्या है जब सभी एक दिन का सामना करेंगे, जब वे अपने सर्वर स्केल करेंगे;)

पीएस किसी अन्य दृष्टिकोण पर बस एक संकेत है कि सॉकेट.io-redis 3.1.0 में customRequest/customHook विधियों का उपयोग करना है।


ver 5.2.0 के साथ अद्यतन: (प्रासंगिक बहु नोड सर्वर)
अब redis अनुकूलक आप 5.2 के रूप में भर में प्रक्रियाओं/नोड्स कमरे देता है।0
स्रोत: RedisAdapter#clients(rooms:Array, fn:Function)

सभी नोड्स भर में उपलब्ध से जुड़े ग्राहक ID की सूची देता है। देखें Namespace#clients(fn:Function)

io.of('/').adapter.clients((err, clients) => { 
    console.log(clients); // an array containing all connected socket ids 
}); 

io.of('/').adapter.clients(['room1', 'room2'], (err, clients) => { 
    console.log(clients); // an array containing socket ids in 'room1' and/or 'room2' 
}); 

// you can also use 

io.in('room3').clients((err, clients) => { 
    console.log(clients); // an array containing socket ids in 'room3' 
}); 


मुबारक कोडिंग!

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