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 로 해주면 된다.
끝