2022-05-04(수) TIL

황인호·2022년 6월 7일
0

TIL 모음

목록 보기
41/119

오늘해야할일들

  • CRUD 작성 완료 [미완료]
  • WebSocket 적용해보기 [미완료]
  • 알고리즘 1문제 풀기 [미완료]

socket.io 에 관하여
Event

서버와 클라이언트 동작원리

서버에서 이벤트는 emit(’event’)로 전달하면 클라이언트는on(’event’)로 받습니다.

Namespace

Namespace란 Express의 라우팅처럼 url에 지정된 위치에 따라 신호의 처리를 다르게 하는 기술이다.

서버와 클라이언트가 연결되면 실시간 데이터 공유가 가능한데, socket을 그냥 사용하면 데이터가 모든 socket으로 들어가게 된다.

하지만 특정 페이지에서 소켓이 보내주는 모든 실시간 메세지를 모두 받을 필요는 없다. 불필요함...

그래서 특정 노드끼리만 연결해주는것이 Namespace 이다.

지금까지는 기본 네임스페이스인 ‘/’ 에 신호를 전송하고 수신했지만, 다른 네임스페이스를 만들어서 신호를 각기 독립적으로 처리할 수도 있는 것이다.

즉, 지정한 Namespace에 있는 소켓 끼리만 통신한다는 개념이다.

[Namespace : 말 그래도 이름이 붙은 공간이며, 소켓을 묶어주는 단위라고 생각하면된다.]

[서버 작성 예시]
const room = io.of('/room')
const chat = io.of('/chat')

//room 네임스페이스 전용 이벤트
room.on('connection', (socket)=> {
	console.log('room 네임스페이스에 접속');
	
	socket.on('disconnection', ()=> {
	console.log('room 네임스페이스 접속 해제')
})

	//같은 room 네임스페이스 소켓으로만 이벤트가 날라간다.
	socket.emit('newroom','방 만들어')
});

//chat 네임스페이스 전용 이벤트
chat.on('connection', (socket)=> {
	console.log('chat 네임스페이스 접속')

	socket.on('disconnection', ()=> {
	console.log('chat 네임스페이스 접속 해제')
	socket.leave(roomId)
});

	//같은 chat 네임스페이스 소켓으로만 이벤트가 날라간다.
	socket.emit('join','참여')
});

서버작성예시를 보면 io.of 를 통해 namespace를 /room과 /chat 으로 나누어 지정해주었다.

네임스페이스의 연결 처리는 제각각이라 연결 콜백(connection)을 따로따로 등록해준다.

이렇게 되면 namespace 객체는 클라이언트에서 /room 혹은 /chat 네임스페이스를 사용하는 소켓과만 통신을 하게 된다.

[Namespace 종류]

  • Default namespace

Default namespace를 / 라고 부르며,

기본적으로 연결되는 Socket.IO 클라이언트와 서버가 기본적으로 수신하는 클라이언트다.

이 네임 스페이스는 io.sockets 또는 간단히 io로 식별된다.

//기본 네임스페이스 이벤트 수신
io.on('connection',socket=> {
	socket.on('disconnect', ()=> {})
})

//기본 네임스페이스 이벤트 송신
io.sockets.emit('hi', 'everyone')
io.emit('hi','everyone')
  • Custom namespaces

사용자 정의 네임 스페이스를 설정하려면 io.of 함수를 사용한다.

const nsp = io.of('/my-namespace')

nsp.on('connection',socket=> {
	console.log('someone connected')
})

nsp.emit('hi','everyone!')

예를들어 카톡 단톡방이 두개가 있다.

단톡방1에 메시지를 보내면 단톡방1의 사용자들은 메시지를 받지만 / 다른 단톡방의 사용자들은 그 메시지를 받지 못한다.

소켓들의 룸도 단톡방과 비슷하다.

특정 룸에 신호를 보내면 룸 안의 소켓들은 신호를 받지만, 다른 룸에 소속된 소켓들은 신호를 받지 못한다.

join() = room에 들어가있는 사람들끼리만 소켓 통신 할 수 있게 지원하는 단축 메서드

leave() = 네임스페이스의 room 떠나기

socket.join() 과 leave(), to() 는 Socket.IO에서 준비해둔 메서드이다.

socket.join 의 인자로 넣어 특정방에 입장할 수 있다.

그리고 socket.leave 로 방에서 나갈 수 있다.

socket.to 를 통해 특정 룸에게만 이벤트를 emit할 수 있다.

즉, join, leave, to의 개념은, socket.io의 Room(채팅방)을 참가/떠나다/한테 개념으로 보면 된다.

출처:https://inpa.tistory.com/entry/SOCKET-📚-Namespace-Room-기능

Node.js 요약정리

출처 : https://inpa.tistory.com/entry/깜지-📝Nodejs-요약-총정리?category=896127

profile
성장중인 백엔드 개발자!!

0개의 댓글