인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

roider2316님의 프로필 이미지
roider2316

작성한 질문수

[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지

실시간으로 텍스트, GIF 보내기

room계층 소켓 연결 후 소통 질문

해결된 질문

작성

·

236

0

서버쪽에선

socket.on("join", (data) => {
      socket.join(data); // 방 참가
      socket.to(data).emit("join", {
        user: "system",
        chat: `${socket.request.session.color}님이 입장하셨습니다.`,
      });
    });

이렇게 room계층 소켓으로 연결했고, 해당 room으로 join이벤트를 보냈는데

브라우저 쪽에선

const socket = io.connect("http://localhost:8005/chat", {
    path: "/socket.io",
  });
  socket.emit("join", new URL(location).pathname.split("/").at(-1));
  socket.on("join", function (data) {...}

/chat 네임스페이스 계층 소켓으로 밖에 연결하지 못했는데 어떻게 해당 room계층으로 온 join이벤트인지 구별하는 게 가능한지 궁금합니다. room계층보다 상위인 네임스페이스 계층에 연결했으니 어느 room으로 오든 네임스페이스만 같으면 모든 이벤트를 다 감지하게 되는 것 아닌가요?

 

답변 1

1

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

브라우저의 socket.emit('join')은 서버의 /chat 네임스페이스로 보내는 요청입니다. room 계층과는 관련이 없습니다.

브라우저의 socket.on('join')을 의미하시는 것이면 /chat 네임스페이스에 연결했고 서버에서 socket.join(방아이디)로 해당 room에 브라우저 소켓을 등록했으니 서버에서 해당 브라우저 소켓에 socket.to(방아이디).emit하면 그 방에 참가한 브라우저 소켓들에 join 이벤트가 전달되는 것이죠.

roider2316님의 프로필 이미지
roider2316
질문자

서버에서 socket.join(방아이디) 하면 서버만 room으로 들어가는 것이 아닌, 브라우저도 같이 그 room으로 들어가게 되나요?

네임스페이스까지는 서버에서도 네임스페이스로 소켓 연결하고, 브라우저에서도 네임스페이스로 소켓 연결하는 식으로 양쪽이 다 각각 연결해줬었는데 room계층에선 서버 한쪽만 연결해주는 것 같아 헷갈립니다

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

socket.join(방아이디)에서 socket은 브라우저의 소켓을 의미합니다. 서버가 room으로 들어가는게 아니라 브라우저가 room으로 들어가는 겁니다.

브라우저의 소켓을 서버에 등록하는 겁니다.

roider2316님의 프로필 이미지
roider2316
질문자

아 이제야 이해가 됩니다. 감사합니다.

roider2316님의 프로필 이미지
roider2316

작성한 질문수

질문하기