2017-09-21 135 views
0

我正在使用NodeJS,ExpressJS & Socket.IO。現在用於一對一的用戶聊天室。我可以簡單地將它們訂閱到特定的聊天室,並通過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 a提供了一種像'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

我想辦法,我可以一次發送數據到多個房間。 –

相關問題