Frameworks/Node.js

[Node.js 강좌] 12. Socket.io - Room / Namespace

양디 2016. 1. 30. 16:30




Socket.io


이번 포스팅은 Socket.io 최신버전의 새로운 기능들에 대해서 알아보자.


먼저 프론트엔드 측에서, socket.io 서버로 연결할 때에 호스트를 입력하지 않아도 되도록 바뀌었다.


기존의 코드가 다음과 같다면,


1
var socket = io('http://localhost:3000/');
cs


이제는 다음과 같이 써도 된다는 것이다.


1
var socket = io();
cs


io는 자동으로 현재 접속해 있는 사이트의 호스트를 찾고, 해당하는 호스트에 socket.io 서버가 열려있다면 연결하게 된다.


무척이나 편리한 기능이 아닐 수 없다 !


Namespace


기존에 Socket.io 에는, Room이라는 기능이 있었다.


소켓에 접속하고, 같은 room 내부의 사람들과 통신할 수 있는 방식이었는데, 여기에 Namespace 라는 개념이 새로 들어왔다.


이는 Room 에 접속하기 이전에 접속하는 것으로, Namespace별로 구분하여 통신이 또한 가능해진다.


즉 통신을 할 때에 socket 들을 구분할 수 있는 단계가 3단계로 늘어난 것인데,


Socket - Namespace - Room 


의 3단계로 늘어난 것이다.


먼저 가장 기본적인 사용인 Socket 으로는, 현재 접속한 Socket 들을 구분할 수 있다.


Namespace 는, 그 Socket들이 접속한 Namespace로 Socket 들을 구분할 수 있다.


마지막으로 Room 은, 접속한 Socket 들 중에, 같은 Namespace 이며, 같은 Room 인원에게 통신을 시도할 수 있다.


프론트엔드 측에서 Namespace 접속 방법은 다음과 같다.


1
var socket = io('/namespace');
cs


위와 같은 방식으로 하면, /namespace 라는 namespace 에 접속된다.


/로 구분되며, 세분화 된 namespace 구현도 가능하다.


백엔드 측에서 Namespace 를 구분하는 방식은 다음과 같다.


1
2
3
4
5
var namespace = io.of('/namespace');
namespace.on('connection'function(socket){
 
});
namespace.emit('hi''everyone!');
cs


위와 같은 방식으로, io 서버 중에서, namespace가 /namespace 인 소켓들의 집합이 var namespace 가 되는 것이다.


이 namespace를 통하여 기존의 소켓과 동일하게 통신을 주고받을 수 있다.



Room


Room 은 네임스페이스 안에서 특정한 Channel 을 구현하는 것이다.


백엔드 측에서 관리하며, Join 과 Leave 함수를 사용해서 Room을 들어갔다 나갔다 할 수 있다.


1
2
3
io.on('connection'function(socket){
  socket.join('rm');
});
cs


위의 코드는 socket이 접속하면, rm 이라는 room으로 들어가게 하는 것이다.


이후에 rm에 있는 사용자에게 통신을 하고 싶다면 ,


1
io.to('rm').emit('some event'):
cs


위와 같은 식으로 하면 된다.


떠날때는 socket.leave 로 해주면 된다.






댓글