Rooms는 접속된 클라이언트들을 룸으로 나눠서 관리할 수 있는 수단을 제공합니다. 그래서 어떤 룸에 있는 클라이언트 모두에 이벤트를 보내는(emit) 것을 쉽게 할 수 있게 해 줍니다.
Join과 Leave
특정 소켓을 어떤 룸에 join 하려면 아래와 같은 방법으로 join() 함수를 사용합니다.
socket.join('room')
leave할 때는 아래와 같이 leave() 함수를 사용합니다.
socket.leave('room')
아래가 활용예입니다.
socket.on('subscribe', function(data) { socket.join(data.room); })
socket.on('unsubscribe', function(data) { socket.leave(data.room); })
이벤트 보내기(emitting)
룸에 있는 모든 클라이언트에게 이벤트를 보내는 방법은 두가지가 있습니다.
socket.broadcast.to('room')
or io.sockets.in('room')
소켓에 브로드케스트(Socket Broadcast)
룸 내에 있는 모든 클라이언트(자신 이외)에 브로드케스트합니다.
활용예
io.sockets.on('connection', function (socket) {
// 이 socket 이외의 room 내의 모두에게 송신
socket.broadcast.to('room').emit('event_name', data)
})
룸을 지정하지 않으면 접속된 모든 클라이언트(자신 이외)에 전송합니다.
io.sockets.on('connection', function (socket) {
// 이 socket 이외의 모두에게 송신
socket.broadcast.emit('event_name', data)
})
io.sockets 이용
특정 룸 내의 모든 클라이언트에 송신
io.sockets.in('room').emit('event_name', data)
모든 클라이언트에 송신
io.sockets.emit('event_name', data)
특정 네임 영역(name space)내의 어떤 room 내에 있는 모든 클라이언트에게 송신
io.of('namespace').in('room').emit('event_name', data)
room 정보 구하기
모든 room 리스트
io.sockets.manager.rooms
room의 이름이 키인 해쉬입니다. 값은 그 room의 소켓 아이디들의 배열입니다. room 명 앞에'/'
가 붙어 있다는 점에 주의합니다. 내부적으로 쓰이는 것이라서 join(), leaver()할 때는 '/'를 붙일 필요는 없습니다.
room 내의 모든 클라이언트
io.sockets.clients('room')
room 내의 모든 클라이언트들(socket 인스턴스)의 리스트를 리턴합니다.io.of('namespace').clients('room')
이런식으로 네임 영역을 지정할 수도 있습니다.
특정 클라이언트가 join해 있는 모든 룸
io.sockets.manager.roomClients[socket.id]
socket이 join해 있는 모든 room들의 이름이 구해집니다. room 명에 '/'
가 붙어 있음에 주의합니다. 또한 모든 클라이언트는 기본으로 무명의 room ""
에 들어 있어 있습니다.
출처 : http://www.ryeonho.com/posts/socket.io_rooms.html