Socket.io

js·2022년 4월 19일
0

메시지 주고 받기

backend

socket.on(방이름: string , function)

frontend에서 emit의 세번째 인자로 넘겨준 콜백을 backend에서 호출 할 수 있고, 이는 frontend에서 실행 된다.

frontend

socket.emit(방이름: string , object, function)

emit으로 자유로운 타입의 원하는만큼의 매개변수를 넘겨 줄 수 있다. 다만, functon은 매개변수의 마지막에 위치해야 한다.

채팅방

채팅방 입장 하기

socket.join(방이름)

socket.join([방1, 방2])

특정 채팅방에 메시지 보내기

socket.to(방이름).emit()

채팅방 나가기

socket.leave(방이름)

모든 참가자(socket)에게 메시지 보내기

wsServer.sockets.emit()

disconnecting

방과의 연결이 완전히 끊어지기 직전에 발생하는 이벤트

socket.rooms는 존재하는 모든 방목록을 Set type으로 반환한다

socket.on("disconnecting", () => {
	socket.rooms.forEach((room) => socket.to(room).emit("bye"));
});

모든 이벤트 보기

socket.onAny(event, ()=> { console.log(event)})

강제로 입장시키기

모든 참가자들을 room1에 입장시키기

wsServer.socketsJoin(room1)

room1의 참가자들을 room2, room3에 입장시키기

wsServer.in(room1).socketsJoin([room2, room3])

Adapter

서로 다른 서버들 사이에서 실시간 어플리케이션을 동기화 하는 역할.

wsServer.sockets.adapter

sids: 존재하는 모든 개인방

wsServer.sockets.adapter.sids

rooms: 존재하는 모든 채팅방 (개인방인 sids, 공개방 포함)

wsServer.sockets.adapter.rooms

sids, rooms 모두 Map 타입

공개방 제목만 가져오는 코드

const { sockets: { adapter: { sids, room } } } = wsServer;
const publicRooms = [];
// Map을 forEach 돌리면 forEach의 매개변수는 forEach(value, key)가 된다

// Map.get(key) => value를 리턴 
rooms.forEach((value, key) => {
	// if 개인방이 존재하지 않는다면 , 즉 공개방이라면  
	if(sids.get(key) === undefined) {
    	publicRooms.push(key);
    }
});

특정 채팅방의 유저수

rooms는 Map 객체, rooms의 value값은 Set객체이므로, Set의 크기인 Set.size로 특정 roomName의 크기를 알 수 있다.

wsServer.sockets.adapter.rooms.get(roomName)?.size

실시간 변경내역 확인

wsServer.on("connection", (socket) => {
wsServer.sockets.emit("room_change", publicRooms());
});

admin panel

1) 세팅후 https://admin.socket.io 접속

2) ServerURL을 내도메인/admin로 설정하기

0개의 댓글