웹 소켓 공부 - 002

변우영·2024년 10월 7일

NodeJS

목록 보기
10/11

Socket.io 기능 개요 및 사용 예시

1. Socket.io 소개

Socket.io는 실시간 양방향 통신을 제공하는 라이브러리로, 클라이언트와 서버 간의 실시간 이벤트 기반 소통이 가능하게 해줍니다. 채팅, 알림, 실시간 게임 등 다양한 실시간 애플리케이션에서 사용됩니다.


2. 주요 Socket.io 기능

1) io.on(event, callback)

  • 설명: 서버에서 특정 이벤트가 발생했을 때, 해당 이벤트에 대한 콜백 함수를 실행합니다.
  • 용도: 클라이언트가 서버에 연결되거나 이벤트를 수신할 때 사용됩니다.
const io = require('socket.io')(3000);

io.on('connection', (socket) => {
    console.log('클라이언트가 연결되었습니다.');
    
    socket.on('message', (msg) => {
        console.log(`메시지 수신: ${msg}`);
    });
});

2) socket.emit(event, data)

  • 설명: 클라이언트 또는 서버에서 특정 이벤트를 발생시키고, 해당 이벤트를 다른 클라이언트 또는 서버로 전송합니다.
  • 용도: 서버에서 클라이언트로, 또는 클라이언트에서 서버로 데이터를 전달할 때 사용됩니다.
// 서버에서 클라이언트로 메시지 전송
socket.emit('message', '안녕하세요 클라이언트!');

3) socket.on(event, callback)

  • 설명: 클라이언트 또는 서버가 특정 이벤트를 수신했을 때 실행할 콜백 함수를 설정합니다.
  • 용도: 서버에서 발생한 이벤트를 클라이언트가 수신할 때, 또는 클라이언트의 이벤트를 서버가 수신할 때 사용됩니다.
// 클라이언트에서 서버로부터 메시지를 수신
socket.on('message', (msg) => {
    console.log(`서버에서 받은 메시지: ${msg}`);
});

4) socket.broadcast.emit(event, data)

  • 설명: 특정 클라이언트를 제외한 모든 클라이언트에게 이벤트를 전송합니다.
  • 용도: 이벤트를 특정 사용자에게는 제외하고 전체에 전달하고 싶을 때 사용합니다.
socket.broadcast.emit('newUser', '새로운 사용자가 접속했습니다.');

5) io.to(room).emit(event, data)

  • 설명: 특정 방에 있는 모든 클라이언트에게 이벤트를 전송합니다.
  • 용도: 특정 방(Room)에 속한 사용자에게만 이벤트를 보내는 데 사용합니다.
io.to('room1').emit('message', 'room1에 있는 사용자들에게 메시지 전송');

3. Socket.io 방(Room) 기능

1) socket.join(room)

  • 설명: 클라이언트를 특정 방(Room)에 가입시킵니다.
  • 용도: 클라이언트를 그룹화하고 특정 클라이언트 그룹에게만 이벤트를 전송할 때 사용됩니다.
socket.on('joinRoom', (room) => {
    socket.join(room);
    console.log(`${socket.id}${room} 방에 가입했습니다.`);
});

2) socket.leave(room)

  • 설명: 클라이언트를 특정 방에서 떠나게 합니다.
  • 용도: 클라이언트를 방에서 나가게 하여 더 이상 해당 방에서 이벤트를 수신하지 않도록 합니다.
socket.on('leaveRoom', (room) => {
    socket.leave(room);
    console.log(`${socket.id}${room} 방에서 나갔습니다.`);
});

4. 실시간 통신 시나리오 예시

1) 실시간 채팅

클라이언트 간의 실시간 채팅 기능을 구현할 때, socket.io는 다음과 같은 흐름으로 동작합니다.

  1. 클라이언트가 서버에 연결

    io.on('connection', (socket) => {
        console.log('사용자가 연결되었습니다.');
        
        // 채팅 메시지 수신
        socket.on('chat message', (msg) => {
            io.emit('chat message', msg);
        });
    });
  2. 클라이언트에서 메시지 전송

    const socket = io();
    socket.emit('chat message', '안녕하세요!');
  3. 모든 클라이언트가 메시지 수신

    socket.on('chat message', (msg) => {
        console.log(`메시지: ${msg}`);
    });

2) 실시간 게임 업데이트

실시간 멀티플레이어 게임에서, 위치 업데이트 등을 클라이언트에게 전송하는 경우:

  1. 서버에서 위치 업데이트 전송

    socket.on('positionUpdate', (position) => {
        socket.broadcast.emit('updatePosition', position);
    });
  2. 클라이언트에서 위치 수신

    socket.on('updatePosition', (newPosition) => {
        console.log(`새 위치: ${newPosition.x}, ${newPosition.y}`);
    });

참고 자료

profile
개발자로 한걸음!

0개의 댓글