"Socket 공부" : socket, socket.io (feat - 리엑트로 배우는 소켓프로그래밍)

그냥차차·2024년 6월 13일
0
post-thumbnail

1. 소켓 통신

  • 소켓 통신은 컴퓨터 네트워크에서 프로세스 간에 데이터를 교환하기 위한 기술
  • 소켓 통신은 TCP/IP 프로토콜 스택 위에서 작동
  • TCP는 연결 지향형 프로토콜로, 데이터 전송의 신뢰성을 보장하고, UDP는 비연결성 프로토콜로, 데이터를 신속하게 보내고 받는 데 사용함

ㄴ. 소켓 메소드

  • onopen : 처음 소켓이 연결되면 실행하는 메소드
  • onmessage : 서버에서 온 메세지를 받음
  • onclose : 소켓 연결이 종료되면 실행함
  • send : 서버로 메시지를 전송할때 사용함
useEffect(() => {
    if (!webSocket) return;
    // 처음 연결시 실행하게함
    webSocket.onopen = function () {
      console.log("open", webSocket.protocol);
    };
    // 서버에서 온 메시지를 받음
    webSocket.onmessage = function (e) {
      const { data, id, type } = JSON.parse(e.data);
      setMsgList((prev) => [
        ...prev,
        {
          msg: type === "welcome" ? `${data} joins the chat` : data,
          type: type,
          id: id,
        },
      ]);
    };
    // 소켓연결이 종료되면 실행하게함
    webSocket.onclose = function () {
      console.log("close");
    };
  }, []);

 // 메시지 보내는 함수
  const onSubmitHandler = (e) => {
    e.preventDefault();
    const sendData = {
      type: "id",
      data: userId,
    };
    // 서버로 메시지 보내기
    webSocket.send(JSON.stringify(sendData));
    setIsLogin(true);
  };

2. 웹소켓

  • 웹소켓은 HTML5에서 도입된 기술로, 웹 브라우저와 웹 서버 간의 실시간 양방향 통신을 가능하게 함
    웹 애플리케이션에서 클라이언트와 서버 간의 통신을 위해 사용되고 실시간 채팅, 온라인 게임, 주식 시장 모니터링 등의 웹 애플리케이션에서 많이 사용됨

ㄱ.소켓과 웹소켓의 차이점

  • 소켓은 일반적으로 TCP/IP 프로토콜 스택 위에서 작동
  • 소켓은 네트워크 통신을 위한 일반적인 엔드포인트로 사용
  • 소켓은 클라이언트와 서버 간의 연결을 유지한 채 데이터를 주고받습니다. 연결을 맺은 후에는 데이터를 전송하기 위해 추가적인 핸드쉐이크가 필요하지 않음
  • 웹소켓은 HTTP 프로토콜 위에서 작동하지만, 일반적인 HTTP 통신과는 다르게 지속적인 연결을 유지하고 양방향 통신을 가능함
  • 웹소켓은 주로 웹 브라우저와 웹 서버 간의 실시간 양방향 통신
  • 웹소켓은 HTTP의 업그레이드 프로토콜로, 클라이언트와 서버 간의 지속적인 연결을 유지하고 양방향 통신을 위한 추가적인 핸드쉐이크를 거칩니다.

3. Socket.io 라이브러리

  • Socket.IO를 사용하면 서버와 클라이언트 간에 실시간으로 양방향 통신을 할 수 있음, 클라이언트나 서버에서 데이터를 보내거나 받을 때 지연 시간이 거의 없는 실시간 통신을 가능하게 함.
  • Socket.IO는 먼저 WebSocket을 시도하고, 만약 WebSocket이 지원되지 않는 경우에는 폴링(polling)과 같은 다른 기술을 사용하여 실시간 통신을 제공함.
  • Socket.IO는 이벤트 기반으로 동작함 클라이언트나 서버에서 이벤트를 발생시키고, 다른 측에서 이러한 이벤트에 대한 리스너를 등록하여 처리할 수 있음
  • 하위 브라우저까지 지원가능하고 웹소켓이(long poling)방식으로 전환하여 실시간 통신을 함
  • 서버와 클라이언트간의 문제가 생기면 자동으로 재연결을 시도함, 다만 서버와 클라이언트 둘다 socket.io로 제작되어야함
  • private, broadcast, public등의 메소드로 채널을 관리하기에 용이함

ㄱ. Socket.io의 이벤트

  • connection : 클라이언트 연결시 동작
  • disconnect : 클라이언트와 서버 연결이 종료되었을때 발생
  • socket.join : 클라이언트에게 방을 할당할때
  • socket.in().to() : 특정 방에 속해있는 클라이언트를 선택할때
  • emit : 소켓 이벤트를 발생시키고 필요한 데이터를 같이 전송가능함
emit('chat message', 'Hello, world!')와 같이 호출하면 'chat message'라는 이벤트를 발생시키고, 'Hello, world!'라는 데이터를 함께 전송함
  • on : 소켓 이벤트를 수신할때 사용함, 특정 이벤트에 대한 리스너를 등록하고, 해당 이벤트가 발생했을 때 실행할 콜백 함수를 정의할 수 있음 예를 들면
서버에서 socket.on('chat message', function(msg){...})와 같이 호출하면 
'chat message'라는 이벤트를 수신하고, 해당 이벤트가 발생했을 때 실행할 콜백 함수를 정의함.

ㄴ. 통신의 종류(채널설정)

  • private : 특정한 소켓에만 전송, 1:1 채팅, 개별 사용자에게 메시지를 보내는 경우 등에 사용 예를 들면
socket.emit('private_message', data)
  • public : 모든 연결된 소켓에게 전송되는 이벤트
io.emit('public_message', data)
  • Broadcast : 특정한 소켓을 제외한 모든 연결된 소켓에게 이벤트를 전송하는 것을 의미, 나를 제외한 모두에게 메시지 전송
socket.broadcast.emit('broadcast_message', data)
profile
개발작

0개의 댓글