51

ユーザーが新しいチャット ルームを作成し、チャットを開始できる Socket.IO の上にシンプルなチャット ルーム システムを構築したいと考えています。

これは単純に聞こえますが、私が現在実行している Socket.IO 0.9.4 として、socket.io のドキュメントと一緒にいくつかの SO 投稿を読んだ後、私はますます混乱しています。したがって、誰かが 0.9.4 で動作するように指示してくれることを願っています。

  1. ルームをサブスクライブする方法が必要です。ルーム名はユーザーが選択します。メッセージがルームに投稿されると、ユーザーはそれを受け取る必要があります。サーバー コードはどのように記述すればよいですか? クライアント コードはどのように記述すればよいですか?

  2. ユーザーは複数のルームに同時に参加できます。

  3. 特定の部屋のすべてのユーザーにメッセージを送信する別のシステムが必要です。この「別のシステム」は、エクスプレスによって処理されるリクエストを通じてメッセージを送信します。そのリクエストハンドラーをどのように記述しますか?

4

1 に答える 1

124

これはすべて、socket.io ルーム機能を使用すると非常に簡単です。LearnBoost wiki のドキュメントを参照してください。

https://github.com/LearnBoost/socket.io/wiki/Rooms

1 つのソケットで複数の部屋に接続できます。次のコードで簡単なテストをまとめました。

サーバ

io.sockets.on('connection', function(client){
    client.on('subscribe', function(room) { 
        console.log('joining room', room);
        client.join(room); 
    })
    
    client.on('unsubscribe', function(room) {  
        console.log('leaving room', room);
        client.leave(room); 
    })

    client.on('send', function(data) {
        console.log('sending message');
        io.sockets.in(data.room).emit('message', data);
    });
});

クライアント

 var socket = io.connect();
 socket.on('message', function (data) {
  console.log(data);
 });
 
 socket.emit('subscribe', 'roomOne');
 socket.emit('subscribe', 'roomTwo');
 
 $('#send').click(function() {
  var room = $('#room').val(),
   message = $('#message').val();
   
  socket.emit('send', { room: room, message: message });
 });

Express ルートからのメッセージの送信も非常に簡単です。

app.post('/send/:room/', function(req, res) {
    var room = req.params.room
        message = req.body;

    io.sockets.in(room).emit('message', { room: room, message: message });

    res.end('message sent');
});
于 2013-05-10T04:10:44.457 に答える