SocketIO란 ?
- 실시간 멀티플레이어 게임이나 실시간 데이터 교환이 필요한 애플리케이션을 개발할 때 사용되는 라이브러리
- 웹 소켓을 기반으로 클라이언트(유니티)와 서버 간의 양방향 통신을 가능하게 함
- 이벤트 기반 통신
Socket.IO 기본 구조
기본적으로 on과 emit를 사용하여 이벤트를 송수신한다.
처음부터 주어진 이벤트로는 접속을 나타내는 'connection'과 연결 해제를 나타내는 'disconnect'가 있다.
const io = require('socket.io')(server);
io.on('connection', (socket) => {
console.log('새 클라이언트 접속:', socket.id);
// 이벤트 등록
socket.on('이벤트명', (data) => {
// 처리 로직
});
// 연결 해제
socket.on('disconnect', () => {
console.log('클라이언트 연결 종료:', socket.id);
});
});
이런 식으로 처음에는 io.On()으로 서버에 연결해주고, 이후에는
socket.on을 통해 이벤트를 등록해주면 된다. 이후에 서버로 같은 이벤트명이 들어오면 들어온 data와 함께 처리 로직이 시행되는 구조이다.
반대로 이벤트(신호)를 보내기 위해서는 socket.emit('이벤트명','로그') 혹은 socket.emit('이벤트명','데이터')를 통해 특정 데이터를 전송할 수도 있다. 기본적으로 to(roomID)를 사용하지 않은 emit는 자기 자신( on으로 서버에 이벤트를 보낸 클라이언트) 에게 신호(이벤트)를 보내게 되고, to(roomId)를 사용한다면 특정 room에 있는 클라이언트에 신호를 보낼 수 있다.
Room
- Socket.IO에서 클라이언트들을 그룹으로 묶는 기능.
- 클라이언트는 하나 이상의 룸에 참여할 수 있고, 서버는 특정 room에만 이벤트를 보낼수 있음
- 기본적으로 각 Socket들은 자동으로 socket.id를 이름으로 하는 room에 들어감
RoomId
- Room을 구분하기 위한 고유 문자열
- 문자열 또는 숫자 가능 ("room123", "game-abc" 등)
자주 쓰는 메서드
- 접속/연결 : io.on('connection', socket => {...})
- 연결 종료 : socket.on('disconnect', () =>{ ... } )
- 메세지 보내기 : socket.emit(event data)
자기 자신에게 보내는 메서드 - 메세지 받기 : socket.on(event. callback)
- 방 참여 : socket.join(roomId)
- 방 나가기 : socket.leave(roomId)
- 방에게 보내기 : socket.to(roomId).emit(event., data)
자기 자신을 제외한 room에 있는 다른 사람에게 보내는 메서드 - 전체 브로드 캐스트 : io.emit(event, data)
모든 Room을 포함한 모든 소켓에게 보냄 - 특정 유저에게 보내기 io.to(socketId).emit(event,data)
해당 소켓 포함 전체 브로드캐스트, 해당 클라이언트에게 직접 보내는 것 - 현재 방 정보 보기 : socket.rooms
- 서버의 모든 방 보기 io.sockets.adapter.rooms
Map 구조이며 Key = roomId, value = Set(socketId)형식이라는 구조
var Rooms = Room[] 로 배열 구조를 만든다면
Rooms.indexOf() , Rooms.splice() , Rooms.shift() 등과 같은 배열 변형, 접근 메서드를 통해 Room들을 관리 가능
의문 : io.to(socketId).emit() vs socket.to(socket.id).emit()
모든 소켓은 기본적으로 생성될 때 자신의 socket.id와 같은 이름의 방을 하나 지닌다면,
굳이 io.to(socketId).emit()로 무언가를 할 필요가 있을까 ? 그냥 socket.to(socekt.id).emit()를 해도 충분하지 않을까 ?
라는 의문이 들었다.
두 차이는 명확하다, socket.to 메서드는 '자신을 제외한' 곳에 보내는 것이기 때문에 이 부분에서 차이가 있다.
특히, 자기 자신이 포함되어 있는 방에 메세지를 보낸다면 이 차이가 두드러진다.
제미나이에게도 교차검증했는데 둘이 말이 달라서 좀 혼란스럽다.
주의사항
- 항상 클라이언트에서 Disconnect를 해 주지 않으면 , 연결 정보가 남아있을 수 있기 때문에 항상 Disconnect를 해 줘야 한다.
'개념공부' 카테고리의 다른 글
JSON 기초 정리 (with Unity) (0) | 2025.03.11 |
---|---|
Session, Cookie + 자동 로그인 기능 (0) | 2025.03.06 |
UnityWebRequest (0) | 2025.03.05 |
Task, Async/Await (0) | 2025.02.22 |
생성자(Constructor) (0) | 2025.02.18 |