2017-09-21 1 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

나는 한 번에 여러 객실에 데이터를 보낼 수있는 방법을 원한다. –

관련 문제