2017-09-21 15 views
0

NodeJS、ExpressJS & Socket.IOを使用しています。 1対1のユーザーチャットルーム。私は単純に両方を特定のチャットルームに登録し、Socket.IOを介してメッセージを更新することができます。 しかし、私は次のチャットルームを持っていると言いましょう。特定の部屋にソケットを送信する

const rooms = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]; 

そして、私は唯一の私は、サーバー側からのことを行うことができますどのように部屋4, 7, 8, 10に特定のメッセージをブロードキャストします。

一般

私は

const roomid = 4; 
global.io.sockets.in(roomid).emit('new message', { message: newPost }); 

次んばかりシングルルームでメッセージを送信する必要がある。しかし、このユースケースのために、私は複数の部屋を持っている、と私は特定の部屋への単一のメッセージを発するようにしたいですソケット接続がアップしている場合(ユーザーがオンラインであることを意味します)、同じ時間です。

+1

https://stackoverflow.com/questions/18304236/sending-messages-to-multiple-rooms-using-socket-io –

答えて

1

メッセージを送信する部屋があるテーブルを持つことができます。そのテーブルをループし、ルームが接続しているかどうかを確認します。

例:

const roomsToEmit = ['room1', 'room2', 'room3']; 
const message = 'some message'; 

roomsToEmit.forEach((roomID) => { 
    if (io.sockets.adapter.rooms[roomID].length > 0) { 
     io.sockets.in(roomID).emit('new message', { message }); 
    } 
}); 

あなたが非同期的にそれをしたいが、私は、私はあなたに発光時に何を待つ必要はありませんようsocket.ioがこれを処理だと思う(より効率的ではないかもしれない場合WS)。

const roomsToEmit = ['room1', 'room2', 'room3']; 
const message = 'some message'; 

Promise.all(roomsToEmit.map((room) => { 
    return new Promise((resolve, reject) => { 
     if (io.sockets.adapter.rooms[roomID].length > 0) { 
       io.sockets.in(roomID).emit('new message', { message }); 
     } 
     return resolve(roomID); 
    }); 
}) 
.then((result) => { 
    // all messages emited 
    // console.log(result) // array of the rooms where a message was emited 
}); 
+0

私は、その目的のためにforループまたは任意のループを使用する必要はありません他のアプローチはありますか? –

+0

残念ながら、私はそれを知っていません。 socket.ioが 'io.sockets.in([1,2,3])。emit( 'new message'、{message});のような方法を提供したとしても、フードの下でループを行います。 –

+0

I私はこれを最適に行うことができる方法を探しています。私はループ、キューベースのシステムでそれを行う必要があります。ここで最善のアプローチは何ですか? –

-1

socket.to('room name').emit('eventname',data)は、送信者以外のすべてのユーザーにデータを送信します。io.to('room name').emit('eventname',data)は、送信者を含むすべてのユーザーにデータを送信します。詳細はhttps://socket.io/docs/emit-cheatsheet/をご覧ください。 あなただけが行う必要がありますio.to('1').emit('newMssage',{ message: newPost })

+0

私は一度に複数の部屋にデータを送ることができる方法をしたいです。 –

関連する問題