• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

broadcast를 사용하지않고 모든 소켓들에게 데이터를 전송할 수 있나요?

21.09.25 20:18 작성 조회수 277

0

어떤 이벤트가 왔을 때 연결되어 있는 모든 소켓들에게

데이터를 emit할 수 있는 방법중 하나가 broadcast인데

broadcast같은 경우 모든 소켓들에게 똑같은 데이터를 줘야하는데 만약 각 소켓들에게 조금씩 다른 데이터를 줘야한다면 

broadcast말고 어떤걸 사용해야하나요?

 

물론 각 소켓이 개별적으로 서버에게 요청해서 받는 방법이 있겠지만 요청 하나만 왔을 때 모든 소켓들에게 데이터를 전송할 수 잇는 방법이 있나요?

답변 1

답변을 작성해보세요.

0

각 소켓에게 개별적으로  emit하셔야합니다. to(소켓아이디) 사용해서요.

IJILKJ님의 프로필

IJILKJ

질문자

2021.09.25

그럼 연결됫 소켓들을 map형태로 저장해놨다가 개별적으로 보내야하는건가요?

아니면 연결된 모든 소켓아이디들을 가져오는 함수가 있나요?

저장해두어야 합니다. 백엔드 코드 보시면 onlineMap이 있는데 그게 이 용도입니다. 아니면 방(room)을 만들어서 그 방에 보내고자 하는 사람을 다 모아두고 보내는 방법(to(방아이디))도 있습니다.

IJILKJ님의 프로필

IJILKJ

질문자

2021.09.25

답글을 보고 to 부분을 찾아보았는데 이것도 그냥 방안에 있는 사람들에게 broadcast하는 방식이여서 모두 같은 데이터를 보내줘야하는거같은데 맞나요?

방안에 사람들에게 모두 보내는데, 조금씩 다른 데이터를 보내야한다면 to는 못쓰는거같은데
이 경우 그냥 Map을 만들어서 개별적으로 보내는게 맞을까요?

Map으로 개별적으로 보내는 경우는 혹시 어떤 식으로 보내야하나요?
socketId를 알아낸다음에 해당 socket으로 보내는 메서드는 보질 못한거같아서요
(보통은 프론트에서 먼저 서버로 emit을 하고 nest의 경우 @ConnectedSocket 인자로 해당 소켓을 감지해서 보낼 수는 있지만
해당 인자가 아닌 다른 소켓의 경우도 보낼 수가 있는건지 해서..)

socketId를 알아낼 수는 없고, 해당사람 정보와 소켓아이디를 보관하고 있는 Map이든 객체든을 만들어두셔야 합니다. 그리고 그 Map이나 객체를 반복문을 돌려서 일일이 to(소켓아이디)로 다른 값을 보내주어야 합니다.

IJILKJ님의 프로필

IJILKJ

질문자

2021.09.26

답글을 보고 to를 이용해서 하려고했는데 
socketio 공식문서를 보면 to를 이용하는 방법이 2가지가 나와있습니다.

 

방법1)

socket.to("room1").emit(..)

 

방법2)

io.to(socketId).emit(...)

 

제로초님이 말씀하신건 방법2 같고 저도 그걸 사용해보려고 했는데

방법1의 socket 변수는 @ConnectedSocket()의 인자인데

 

방법2의 io 변수는 nestjs에서 어떻게 Import해서 가져와야 하나요?

 

방법2에서도 socket 쓰시면 됩니다.

IJILKJ님의 프로필

IJILKJ

질문자

2021.09.26

잘 안되서 이것저것 찾아보다가 

@WebsocketServer() server: Server

위 변수를 class내에 선언 해놓고

sever.to(socketId).emit(...) 이렇게하니까 작동이 되던데

 

server 변수말고 @ConnectedSocket()의 socket변수를 사용해야 하나요?

제가 강좌에서 한대로 하시면 됩니다.

this.server.to(방아이디/소켓아이디).emit(이벤트, 데이터) 이렇게 했는데

이걸 그대로 쓰시면 됩니다.