2012-12-21 18 views
7

マルチチャットアプリケーションの検討。 ユーザーは複数のルームに参加できます(socket.join(room))、ユーザーはルーム(socket.leave(room))を離れることができます。Node.js&Socket.IO - 部屋の問題

ソケットが部屋を離れるとき、私は他の部屋の参加者に通知します。ソケットが現在3つの部屋にある場合、彼は部屋を適切な方法で離れることなくウェブサイトから突然切断します。ユーザーが残した部屋にどうすれば通知できますか?

私がオンソケット切断イベントを処理すると、ユーザーはその時点でどの部屋にも存在しなくなります。ユーザーの個別の配列を保持する唯一の方法ですか、私は考えていないいくつかの巧妙な方法ですか?

+0

私が何をしているかにかかわらず、socketio – r3wt

答えて

5

切断イベント中に、ソケットあなたのプロセスで引き続き使用できます。 socket.ioが自動的に切断イベント時にroomsを整理しますと、これは実際には必要ではないがたとえば、これは

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

を動作するはずです。ただし、特定のアクションを実行する場合は、この方法を使用できます。

+0

window.onbeforeunloadクライアントのブラウザで?あなたはそれが不安定になると思いますか? –

+0

あなたはそれを行うことができますが、私はそこに多くの点があるとは思わない。この人が放置した部屋の他のユーザーに警告しようとしています。特定のクライアントのビューは他のものに影響を及ぼさないので、あなたができる唯一の便利なことは、他のすべてのユーザに彼らが残したことを伝えるソケットイベントを起動させることです。それをサーバー上に保持し、切断イベントを使用する方がよいでしょう。 – Loourr

+0

私はあなたの最初の部分は答えていない...部屋が動的に作成されている場合はどう?それぞれのためにio.of(./ room1).onを作成する必要がありますか? –

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/

+0

によると、部屋に2人のユーザーが常駐しています。ソケットはsocket.ioセッションです...何もない(socket.id) –

関連する問題