7

マルチチャットアプリを検討中。ユーザーは複数のルームに参加でき ( socket.join(room))、ルームから退出できます ( socket.leave(room))。

ソケットが部屋を出るときに、他の部屋の参加者に通知します。ソケットが現在 3 つの部屋にあり、適切な方法で部屋を離れずに Web サイトから突然切断された場合、ユーザーが部屋を離れたことをそれらの部屋に通知するにはどうすればよいですか?

on socket disconnect イベントを処理すると、ユーザーはその時点でどの部屋にもいなくなります。ユーザーの個別の配列を維持する唯一の方法ですか、それとも私が考えていない賢い方法がありますか?

4

2 に答える 2

5

切断イベントの間、ソケットは引き続きプロセスで使用できます。たとえば、これはうまくいくはずです

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

socket.io は切断イベントでルームを自動的にプルーニングするため、これは実際には必要ありません。ただし、特定のアクションを実行しようとしている場合は、この方法を使用できます。

于 2012-12-21T16:44:37.923 に答える
0

ソケットは、ノード プロセスで長寿命のオブジェクトであると想定しています。その場合は、ユーザーが接続したときにソケット オブジェクトにユーザーへの参照を簡単に追加できます。ソケットが切断された場合、セッションが関連付けられているユーザーを検索する必要はありません。

接続時またはログイン時:

socket.user = yourUser;

切断時:

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

ソケット オブジェクトとシングル ルーム チャット クライアントにプロパティを追加する例については、こちらを参照してください。

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

于 2012-12-21T11:33:03.013 に答える