2011-11-27 20 views
8

का उपयोग कर कनेक्टेड क्लाइंट की एक सूची बनाएं यहां 2 संबंधित प्रश्न हैं। उन्हें एक साथ पोस्ट करना और अधिक समझ में आता है।socket.io

प्रश्न 1

मैं जो सभी ग्राहकों के लिए बाहर एक घटना का उत्सर्जन करता है एक Node.js एप्लिकेशन है, और सभी मौजूदा ग्राहकों को एक ready फेंकना के साथ जवाब देंगे। मैं उन सभी ग्राहकों की एक सूची कैसे बना सकता हूं जो प्रारंभिक उत्सर्जन का उत्तर देते हैं, और ग्राहकों को अलग करने के लिए किस प्रकार की पहचान का उपयोग किया जा सकता है?

Question2:

मैं के बाद क्या करना जुड़ा ग्राहकों की सूची एकत्रित कोशिश कर रहा हूँ क्या है, तो पंक्तियों की N संख्या का एक MySQL डेटाबेस तालिका को एक्सेस और प्रत्येक ग्राहक X पंक्तियों प्रत्येक आवंटित करने के लिए है। ये पंक्तियां अपने संबंधित ग्राहकों को वापस भेज दी जाएंगी। यह कैसे किया जा सकता है?

वर्तमान कोड Qn 1

नोड कोड

setInterval(function() { 
    util.log('Checking for new jobs...'); 
    dbCheckQueue(function(results) { // checks if there are new rows to "distribute" to clients 
     if (results.length) { 
      util.log(results.length + ' new jobs found.'); 
      io.sockets.emit('job_available'); 
     } 
    }); 
}, 10*1000); 

क्लाइंट-साइड जे एस कोड

socket.on('job_available', function() { 
       console.log('Job Available.. Responding with Ready!'); 
       socket.emit('ready'); 
      }); 

io.sockets.on('connection', function(socket) { 
    socket.on('ready', function() { 
     // UPDATE N rows with client_id in column checkout. 
     // Then SELECTS * from table where checkout = client_id 
     getListings(client_id, function(listings) { 
      socket.emit('job', listings); // send jobs 
     }); 
    }); 
}); 

वर्तमान कोड Qn 2 के लिए ०१२३५१६४१०६ के लिएकोड एक क्लाइंट के लिए काम करता है, लेकिन मैं सभी कनेक्टेड क्लाइंट्स के माध्यम से कैसे लूप करता हूं और कॉलम का वही अद्यतन करता हूं और पंक्तियों का चयन करता हूं?

io.sockets.on('connection', function(socket) { 
    socket.on('ready', function() { 
     // UPDATE N rows with client_id in column checkout. 
     // Then SELECTS * from table where checkout = client_id 
     getListings(client_id, function(listings) { 
      socket.emit('job', listings); // send jobs 
     }); 
    }); 
}); 

उत्तर

16

आप कनेक्ट किए गए ग्राहकों खुद का ट्रैक रखने की जरूरत होगी। अपने ready ईवेंट हैंडलर या जो कुछ भी में

var clients = []; 

io.sockets.on('connect', function(client) { 
    clients.push(client); 

    client.on('disconnect', function() { 
     clients.splice(clients.indexOf(client), 1); 
    }); 
}); 

तो फिर तुम कर सकते हैं संदर्भ है कि सर्वर पर clients सरणी भी आप की जरूरत है,: ऐसा करने के लिए आसान तरीका एक सरणी का उपयोग करने के लिए होगा। कुछ की तरह:

io.sockets.on('connection', function(socket) { 
    socket.on('ready', function() { 
     // UPDATE N rows with client_id in column checkout. 
     // Then SELECTS * from table where checkout = client_id 
     clients.forEach(function(client, index) { 
      var client_id = index; // Just use the index in the clients array for now 
      getListings(client_id, function(listings) { 
       socket.emit('job', listings); // send jobs 
      }); 
     }); 
    }); 
}); 
+0

आप एक getListings() फ़ंक्शन के तर्क proevide सकता है क्योंकि मैं smiliar समाधान को लागू करने, लेकिन मैं एक के नाम पर स्क्रीन पर देख पहले लॉग इन उपयोगकर्ता। – johannesMatevosyan

+0

'getListings' कॉल केवल नमूना कोड है जिसे मैंने मूल प्रश्न से खींचा है। मुझे नहीं पता कि इसमें क्या शामिल है या यह कैसे कार्यान्वित किया गया है। – rossipedia

+0

मैं देख रहा हूँ, क्योंकि मैं सरणी में ग्राहकों के संचय कर रहा हूँ और जब मैं उन्हें 'foreach' या' for' छोरों मैं बस केवल पहली ब्राउज़र में ग्राहक के उपयोगकर्ता नाम में लॉग इन के hepl साथ पुनः प्राप्त करने का प्रयास करें। – johannesMatevosyan

19

Socket.io कि के लिए एक सार्वजनिक एपीआई प्रदान करता है, इसलिए बजाय ब्रायन की तरह कुछ ऊपर हैकिंग के सुझाव है कि आप उपयोग कर सकते हैं:

io.sockets.clients() 

सभी जुड़े हुए की एक सरणी देता होगा कि ग्राहकों।

आप एक निश्चित नाम स्थान से जुड़े सभी ग्राहकों चाहते हैं:

io.of('/namespace').clients() 

लेकिन आप भी .. यह और भी अधिक फ़िल्टर अगर आप एक कमरे में सब सॉकेट करना चाहते हैं कर सकते हैं:

io.sockets.clients('room name here as first argument') 

कमरे के लिए जुड़ा सॉकेट की एक सरणी वापस आ जाएगी room name here as first argument

+0

धन्यवाद 3rdEden, मैं मामूली परिवर्तनों के साथ ब्रायन का समाधान किया जाता है क्योंकि मैं केवल उन जुड़े ग्राहकों है कि एक 'ready' संदेश के साथ जवाब दिया एक सरणी में धकेल दिया जा चाहते हैं। एपीआई का उपयोग कुछ अलग तरीके से कर सकते हैं? – Nyxynyx

+0

वास्तव में एपीआई के साथ थोड़ा हैकिंग बेहतर होगा आपको सब कुछ करना था जैसे socket.isReady = true; जब तैयार है प्राप्त है और उस से आप एक और सूची mantaining से अपने आप को बचाया जाएगा: पी – ShrekOverflow

+0

यह जाने का रास्ता है! धन्यवाद :) –