Socket.IO APIs

Socket.IO 이밖에도 다양한 이벤트를 전달할  있는 API 제공하는데이에 대해서 살펴보자.

여기서 사용하는 socket이라는 객체는

io.sockets.on('connection',function(socket){

 의해서 callback function 의해서 전달된 인자임을 미리 명시해둔다.


1. 이벤트 보내기 받기

먼저 소켓으로 또는부터 이벤트를 보내고 받는 방법부터 알아보자.앞에 예제에서도 봤지만 가장 간단한 방법은

Ÿ  * 이벤트 보내기 socket.emit('이벤트명',{메세지});

현재 연결되어 있는 클라이언트 소켓에 “이벤트명”으로 “{메시지}” 데이터로 이벤트를 보낸다.

Ÿ  *  이벤트 받기 socket.on('이벤트명',function(data){ });

현재 연결되어 있는 클라이언트 소켓으로부터 들어오는 이벤트명이벤트에 대해서 두번째 인자로 정의된 callback function 의해서 이벤트에 대한 처리를 한다이때 이벤트 메시지는 callback function인자인 “data” 통해서 전달된다.

하나의 클라이언트가 아니라 다수의 다른 클라이언트나 또는 다른 클라이언트에 이벤트를 어떻게 보내는지알아보자

Ÿ  * 나를 제외한 다른 클라이언트들에게 이벤트 보내기 socket.broadcast.emit('이벤트명',{메세지});

socket 대해서 broadcast 하면나를 제외한 다른 소켓 클라이언트들에게 이벤트를 보낼  있다.

Ÿ  * 나를 포함한 모든 클라이언트들에게 이벤트 보내기io.sockets.emit('이벤트명',function(data){ });

개별 클라이언트 소켓을 대표하는 객체가 socket이라면전체 연결된 socket들을 대표하는 객체는io.sockets이다여기서는 io.sockets.emit 사용했는데이는 전체 연결된 클라이언트 소켓에 대해서이벤트를 보내도록  것이다.

 소켓이 아닌 다른 특정 소켓에게 이벤트를 보내는 방법이 있는데,

Ÿ  * io.sockets(socket_id).emit('이벤트명',function(data){ });

 사용하면 된다이때 socket_id socket.id 값으로  클라이언트 소켓은 id라는 property 가지고있고이는  소켓을 구별해주는 식별자가 된다그나중에 예제에서 설명하겠지만채팅 귓속말과 같이 특정 소켓으로 메시지를 보내려면메시지를 전달하는 대상이 되는 소켓의 id값을 알아서 위의io.socket(socket_id) 이벤트를 전달해야 한다.


2.  소켓에 데이터 바인딩

 소켓에는 소켓에 연관된 데이터를 set 메서드를 이용해서 binding하고, get 이용해서 binding  데이터를꺼낼  있다.

Ÿ   * socket.set(‘key’, ‘value’,function() {});

Ÿ   socket.get(‘key’function(err,value) {});

Ÿ   socket.del(‘key’function(err,value) {});

값으 저장할때는 set을 이용하여 socket key값을 키로 사용하여 value라는 데이터를 저장한다값을 읽어올 때는 get을 이용하여 socket에 저장된 key이름으로 저장된 값을 value를 통해서 리턴한다.그리고 해당값을 삭제하고자 할때는 del을 이용하여 socket key이름으로 저장된 값을 삭제한다.

socket도 객체이기 때문에 Object property를 사용해도 되는데예를 들어 socket.key = value 왜 굳이 set/get을 사용할까? socket.io의 set/get 내부 구현을 뜯어보면 실제로는 Object property를 사용한다 socket.iostore Redis로 지정하게 되면 set/get은 값을 내부 Object property에 저장하지 않고, Redis에 저장하게 되서이 값들은 클러스터 노드 (다른 노드간)에서도 접근이 가능해진다.

3.  Room 처리 (그룹)

socket.io 소켓들을 그룹핑하는 채널과 같은 개념인 ‘room’이라는 개념을 지원한다채팅 프로그램의 대화방과 같은 개념이다. Room 사용하게 되면 broadcast 하더라도 같은 room안에 있는 클라이언트에게만 이벤트가 전송된다.

Ÿ   socket.join(‘roon name’)

Ÿ   socket.leave(‘roon name’)

소켓을 특정 room binding하는 방법은 join 이용하면 해당 소켓은  room binding 되고, leave 하면 room에서부터 나오게 된다.

특정 room 있는 socket에게 이벤트를 보내는 것은 앞에 설명한 똑같이 socket.emit 사용하면 되는데, broadcast 하거나 room안에 있는 전체 클라이언트 소켓에게 이벤트를 보낼때는 아래와 같이 room 명시해주면 된다

Ÿ   io.sockets.in(‘roon name’).emit(‘event’,message)

‘room name’ room안에 있는 모든 클라이언트들에게 이벤트 보내기

Ÿ   socket.broadcast.to(‘roon name’).emit(‘event’,message)

 ‘room name’ room 안에 있는 나를 제외한 다른 클라이언트들에게 이벤트 보내기

또한 현재 생성되어 있는 room 대한 정보를 읽어오는 방법이 몇가지가 있는데,

Ÿ  io.sockets.manager.rooms

현재 생성되어 있는 모든 room 목록을 리턴한다.

Ÿ  io.sockets.clients(‘roon name’)

 ‘room name’ room 안에 있는 모든 클라이언트 소켓 목록을 리턴한다.

몇가지 주요 메서드들을 성명하였지만여기서 설명한 것은 일부에 불과하다상세한 내용들은 아래 내용을 참고하기바란다.

상세한 Configuration 처리 https://github.com/LearnBoost/Socket.IO/wiki/Configuring-Socket.IO

이벤트 종류(disconnect https://github.com/LearnBoost/socket.io/wiki/Exposed-events

자아 그러면 소개된 메서드들을 가지고앞에서 만든 채팅 프로그램의 기능을 더해보도록 하자



출처 : 조대협 (http://bcho.tistory.com)

'Programming > Node.js' 카테고리의 다른 글

Socket.IO 4/4 - 채팅방 기능 추가하기  (0) 2014.05.08
Socket.IO 3/4 (1:1 귓속말 구현)  (0) 2014.05.08
Socket.IO (1/4)  (0) 2014.05.08
mySQL 연동  (0) 2014.05.08
mongoose ODM 을 이용한 MongoDB 연동  (0) 2014.05.08

+ Recent posts