[socket.io] The Socket instance (server-side)

김혜지·2020년 12월 1일
0
post-custom-banner

본문

The Socket instance (server-side)

이 외에도:

  • 이벤트 방출(emit) 및 수신(listen)
  • broadcasting 이벤트
  • 룸 참여 및 나가기

Socket 인스턴스에는 응용 프로그램에서 사용할 수 있는 몇 가지 속성이 있습니다.

Socket#id

각각의 새 연결에는 임의의 20 자 식별자가 할당됩니다.
이 식별자는 클라이언트 측의 값과 동기화됩니다.

// server-side
io.on("connection", (socket) => {
  console.log(socket.id); // ojIckSD2jqNzOqIrAGzL
});

// client-side
socket.on("connect", () => {
  console.log(socket.id); // ojIckSD2jqNzOqIrAGzL
});

생성시 소켓은 자신의 ID로 식별되는 방에 참여합니다. 즉, 개인 메시지에 사용할 수 있습니다.

io.on("connection", socket => {
  socket.on("private message", (anotherSocketId, msg) => {
    socket.to(anotherSocketId).emit("private message", socket.id, msg);
  });
});

참고: 이 식별자는 Socket.IO 코드베이스의 여러 부분에서 사용되므로 덮어 쓸 수 없습니다.

Socket#handshake

이 객체에는 Socket.IO 세션이 시작될 때 발생하는 핸드 셰이크에 대한 세부 정보가 포함되어 있습니다.

{
  headers: /* the headers of the initial request */
  query: /* the query params of the initial request */
  auth: /* the authentication payload */
  time: /* the date of creation (as string) */
  issued: /* the date of creation (unix timestamp) */
  url: /* the request URL string */
  address: /* the ip of the client */
  xdomain: /* whether the connection is cross-domain */
  secure: /* whether the connection is secure */
}

Socket#rooms

소켓이 현재있는 방에 대한 참조입니다.

io.on("connection", (socket) => {
  console.log(socket.rooms); // Set { <socket.id> }
  socket.join("room1");
  console.log(socket.rooms); // Set { <socket.id>, "room1" }
});

Additional attributes

기존 속성을 덮어 쓰지 않는 한 모든 속성을 Socket 인스턴스에 연결하고 나중에 사용할 수 있습니다.

// in a middleware
io.use(async (socket, next) => {
  try {
    const user = await fetchUser(socket);
    socket.user = user;
  } catch (e) {
    next(new Error("unknown user"));
  }
});

io.on("connection", (socket) => {
  console.log(socket.user);

  // in a listener
  socket.on("set username", (username) => {
    socket.username = username;
  });
});

Events

  • disconnect

이 이벤트는 연결 해제시 Socket 인스턴스에 의해 시작됩니다.

io.on("connection", (socket) => {
  socket.on("disconnect", (reason) => {
    // ...
  });
});
  • disconnecting

이 이벤트는disconnect와 유사하지만 Socket#rooms set이 아직 비어 있지 않은 경우 조금 더 일찍 시작됩니다.

io.on("connection", (socket) => {
  socket.on("disconnecting", (reason) => {
    for (const room of socket.rooms) {
      if (room !== socket.id) {
        socket.to(room).emit("user has left", socket.id);
      }
    }
  });
});

참고: connect, connect_error, newListenerremoveListener와 함께 이러한 이벤트는 애플리케이션에서 사용하면 안되는 특수 이벤트입니다.

// BAD, will throw an error
socket.emit("disconnect");
profile
Developer ( Migrating from https://hyex.github.io/ )
post-custom-banner

0개의 댓글