HTTP

[Socket.io] socket.io 룸 생성과 메세지 전달 프로세스

SeanK 2022. 3. 11. 21:53

 

오늘은 socket.io의 룸 생성과 메시지 전달 프로세스에 대해 알아보자. 

 

무지 성으로 socket.io를 이용해 메시지 기능을 넣고 보니... 정말 오류가 난리도 아니다. 

 

일단은 제일 난감한 오류는 한명이 메시지를 보내면 메시지와 상관없는 모오오든 유저들이 메시지를 받아버리는 기이한 현상이 있었다. 

 

왜 그럴까?

 

원인은 바로 socket.io의 braodcast 기능 때문이었다. 

 

socket.io은 아래처럼 특정한 대상을 지칭하지 않으면 broadcast로 메세지를 전달한다. 용어에서 짐작할 수 있듯 소켓에 연결된 모든 유저에게 방송을 해버리는 것이다.  

 

socket.emit("send-message", {message})

 

그래서 특정사람에게만 메시지를 보내고 싶다면 그 사람의 socket id를 추가하거나 룸넘버를 지정해줌으로써 특정 사람만이 메시지를 받게끔 설정해야 한다. 

 


룸 생성

 

CLIENT ==> socket.emit("join-room") ==> SERVER ==> socket.on("join-room", () => socket.join(room))

 

룸 생성방법은 아주 간단하다. 

 

우선 클라이언트에서 방으로 입장한다는 신호를 보내면 서버에서 그 신호에 socket.join() 메서드를 실행하게끔 설정하면

 

룸을 생성하고 입장하는건 끝이다. 단 몇 줄로 이 모든 과정이 처리된다니... socket.io 정말 대단하다...

 

이때 메소드 안에 원하는 룸넘버를 넣어주면 된다. 

 


메시지 전달 프로세스

CLIENT ==> socket.emit("send-message", message) ==>

SERVER ==> socket.on("send-message", () => io.to(room). emit(~))

 

이후 프로세스는 이지 피지 레몬 스퀴지.

 

서버에서 회신할 때만 io.to() 메서드로 어떤 룸에 메시지를 전달할지만 특정해주고,

 

일반적인 메세지 송수신처럼 emit()으로 메세지를 보내면 끝!

 


정리

 

socket.broadcast() ==> 해당 메서드는 '나'를 제외한 나머지의 사람들에게 전체 메세지를 보낸다.
io.emit() ==> 해당 메소드는 소켓에 접속해있는 모든 이들에게 메시지를 보낸다.