2012-12-11 12 views
6

मैं एक NodeJS आवेदन इस तरह सॉकेट कब और एक्सप्रेस के साथ जोड़ लिया है:सॉकेट io उपयोगकर्ता कनेक्शन प्रत्येक एचटीएमएल पेज पर ताज़ा किया गया ताज़ा?

सर्वर:

var storeEachSocket=[]; 
var io = require('socket.io').listen(80); 
io.sockets.on('connection', function (socket) { 
    storeEachSocket.push(socket); 
    console.log(storeEachSocket.length); 
    var clients = io.sockets.clients(); //clients is an array 
    console.log(clients.length); 
}); 

ग्राहक:

<script src="/socket.io/socket.io.js"></script> 
<script> 
var socket = io.connect('http://localhost'); 
</script> 

इस समय वहाँ केवल एक एचटीएमएल सर्वर के द्वारा संचालित पेज है। मैंने पाया कि, सॉकेट कनेक्शन HTML और सर्वर के बीच बनाया गया था (इस समय storeEachSocket.length 1 है और क्लाइंट। लम्बाई 1 है), और यदि मैं इस HTML पृष्ठ को रीफ्रेश करता हूं, तो storeEachSocket.length और clients दोनों तरंगें होंगी 2, यह इंगित करता है कि इस एचटीएमएल और सर्वर के बीच 2 सॉकेट कनेक्शन हैं। मैं जानना चाहता हूं कि यह सामान्य है? दूसरा सॉकेट कनेक्शन बनाने के बाद भी पहला सॉकेट कनेक्शन मर जाएगा नहीं?

और मैं यह भी जानना चाहता हूं, अगर मैं इस उपयोगकर्ता (एचटीएमएल) को ट्रैक करना चाहता हूं, तो एक उपयोगकर्ता द्वारा उपयोग किए जाने वाले दो सॉकेट कनेक्शन होने पर मैं क्या करूँ?

उत्तर

9

पृष्ठ को रीफ्रेश करने से नया कनेक्शन नहीं जुड़ता है, यह मूल रूप से वर्तमान कनेक्शन को हटा देता है और एक और नया कनेक्शन बनाता है। मुझे लगता है कि आपको ईवेंट को डिस्कनेक्ट करने के लिए श्रोता जोड़ना चाहिए और उस डिस्क में सॉकेट को हटा देना चाहिए जो डिस्कनेक्ट हो गया है। मुझे यह भी विश्वास नहीं है कि io.sockets.clients() रीफ्रेशिंग के बाद 2 वापस आ जाएगा क्योंकि मैंने इसे अपनी मशीन पर परीक्षण किया है।

यदि आप उपयोगकर्ताओं को ट्रैक करना चाहते हैं, तो आपको एक उपयोगकर्ता आईडी होना चाहिए और उसे एक कुंजी/मूल्य जोड़ी संग्रह में स्टोर करना होगा। फिर आप उपयोगकर्ता को तीन प्राधिकरण हैंडलर में संग्रह की जांच करके 2 कनेक्शन बनाने के लिए प्रतिबंधित कर सकते हैं।

var storeEachSocket = {}; 
    io.set('authorization', function(handshake, accept){ 
     var user = handshake.query; 
     if(user.id in storeEachSocket) 
     accept('User already connected', false); 
     else 
     accept(null, true); 
    }); 

    io.on('connection', function(socket){ 
     var user = socket.handshake.query; 
     storeEachSocket[user.id] = socket; 
    }); 

    io.on('disconnect', function(socket){ 
     var user = socket.handshake.query; 
     delete storeEachSocket[user.id] 
    }); 
+0

अच्छा, बहुत बहुत धन्यवाद। – user1893787

+0

सॉकेट.handshake.query में socket.handshake.query नहीं है – Sever

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