2012-12-11 8 views
6

Ich habe eine NodeJS Anwendung mit Sockel io und Express wie folgt hinzugefügt:socket io Benutzerverbindung hinzugefügt auf jeder HTML-Seite aktualisieren?

Server:

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); 
}); 

Auftraggeber:

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

Derzeit ist nur EIN dort HTML-Seite vom Server bedient. Ich habe festgestellt, dass, nachdem die Socket-Verbindung zwischen HTML und Server erstellt wurde (zu diesem Zeitpunkt ist storeEachSocket.length 1 und clients.length ist 1), und wenn ich diese HTML-Seite aktualisieren, würden sowohl storeEachSocket.length und clients.length sein 2, darauf hinweist, dass es zwei Socket-Verbindung zwischen diesem HTML und dem Server gibt. Ich möchte wissen, ist das normal? die erste Socket-Verbindung würde nicht aussterben, selbst wenn ich die zweite Socket-Verbindung herstelle?

Und ich möchte auch wissen, wenn ich beabsichtige, diesen Benutzer (HTML) zu verfolgen, was soll ich tun, wenn zwei Socket-Verbindungen von dem einen Benutzer verwendet werden?

Antwort

9

Aktualisieren der Seite fügt keine neue Verbindung hinzu, es entfernt im Grunde die aktuelle Verbindung und erstellt eine weitere neue Verbindung. Ich denke, dass Sie einen Listener hinzufügen sollten, um Ereignis zu trennen und den Socket in dem Array zu entfernen, das getrennt worden ist. Ich glaube auch nicht, dass io.sockets.clients() 2 nach der Aktualisierung zurückgeben würde, wie ich es auf meinem Rechner getestet habe.

Wenn Sie Benutzer verfolgen möchten, müssen Sie eine Benutzer-ID haben und diese in einer Schlüssel/Wert-Paar-Sammlung speichern. Dann können Sie einen Benutzer darauf beschränken, zwei Verbindungen zu erstellen, indem Sie die Sammlung im Autorisierungshandler überprüfen.

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

gut, vielen dank. – user1893787

+0

socket.handshake.query enthält keine socket.handshake.query – Sever

Verwandte Themen