2012-12-21 19 views
7

Betrachtet eine Multi-Chat-Anwendung. Benutzer können mehreren Räumen beitreten (socket.join(room)), Benutzer können einen Raum verlassen (socket.leave(room)).Node.js & Socket.IO - Zimmer Ausgabe

Wenn die Steckdose einen Raum verlässt, benachrichtige ich die anderen Raumteilnehmer. Wenn sich der Socket derzeit in 3 Räumen befindet und er sich plötzlich von der Website trennt, ohne die Räume ordnungsgemäß zu verlassen, wie kann ich diese Räume benachrichtigen, die der Benutzer verlassen hat?

Wenn ich mit dem On-Socket-Disconnect-Ereignis arbeite, ist der Benutzer zu diesem Zeitpunkt nicht mehr in einem Raum. Ist das die einzige Möglichkeit, eine separate Benutzergruppe zu halten, oder gibt es eine clevere Art, an die ich nicht gedacht habe?

+0

hmm, egal was ich zu tun scheinen gibt es immer 2 Benutzer in den Raum nach socketio – r3wt

Antwort

5

Während des Ereignisses trennen Sie den Socket ist für Ihren Prozess noch verfügbar. Zum Beispiel sollte diese

io.socket.on('connection', function(socket){ 
    socket.on('disconnect', function() { 
     // this returns a list of all rooms this user is in 
     var rooms = io.sockets.manager.roomClients[socket.id]; 
     for(var room in rooms) { 
      socket.leave(room); 
     } 
    }); 
}); 

arbeiten Obwohl dies eigentlich nicht notwendig ist, da socket.io automatisch rooms auf ein Trennungsereignis beschneiden wird. Diese Methode kann jedoch verwendet werden, wenn Sie eine bestimmte Aktion ausführen möchten.

+0

wie über die Verwendung der window.onbeforeunload im Client-Browser? Glaubst du, dass es instabil wird? –

+0

Sie könnten das tun, aber ich denke nicht, dass es viel Sinn machen würde. Sie versuchen, die anderen Benutzer in einem bestimmten Raum zu warnen, die diese Person verlassen hat. Die Ansicht des jeweiligen Clients hat keine Auswirkungen auf die anderen Clients. Sie können also nur ein Socket-Ereignis auslösen, das allen anderen Benutzern sagt, dass sie es verlassen haben. Es wäre besser, es auf dem Server zu behalten und das disconnect-Ereignis zu verwenden. – Loourr

+0

Ich verstehe nicht ganz den ersten Teil von dir beantworten ... was ist, wenn die Räume dynamisch erstellt werden? Muss ich für jedes von ihnen ein io.of (./ room1) .on erstellen? –

0

Ich gehe davon aus, dass Socket ein langlebiges Objekt in Ihrem Knotenprozess ist. Wenn das der Fall ist, können Sie problemlos einen Verweis auf den Benutzer auf Ihrem Socket-Objekt hinzufügen, wenn der Benutzer eine Verbindung herstellt. Wenn Sie eine Socket-Trennung erhalten, müssen Sie nicht den Benutzer suchen, mit dem die Sitzung verknüpft ist, da sie dort sein wird.

auf Verbindung oder Login:

socket.user = yourUser; 

auf disconnect:

socket.on('disconnect', function(){ 
    socket.leave(room, socket.user); 
} 

von Hinzufügen von Eigenschaften zu dem Socket-Objekt hier für ein Beispiel zu sehen und ein Einzelzimmer-Chat-Client:

http://psitsmike.com/2011/09/node-js-and-socket-io-chat-tutorial/

+0

Ein Socket ist eine socket.io Sitzung ... nichts mehr (socket.id) –

Verwandte Themen