가수면

리액트에서 Socket.io 구현 본문

React/라이브러리

리액트에서 Socket.io 구현

니비앙 2023. 7. 27. 22:04

클라이언트 파트만 다룸

 

패키지 설치

npm install socket.io-client

 

1. 소켓 인스턴스를 참조할 ref를 생성한다.

const socketRef = useRef<Socket | null>(null);

2. 소켓 인스턴스 생성 / 연결 종료

인스턴스 생성 후 useEffect 클린업을 사용해 컴포넌트가 언마운트되면 연결 종료되도록 설정한다.

    useEffect(() => {
    socketRef.current = io("서버 주소");

    return () => {
      if (socketRef.current) {
        socketRef.current.disconnect();
      }
    };
  }, []);

3. 이벤트 리스너 등록

서버에서 "서버와 맞춘 이벤트 이름" 이벤트를 받았을 때 호출될 콜백 함수를 등록한다.

아래 예시 코드는 채팅 내역을 표현하기 위해 쌓이는 채팅을 상태값으로 관리하는 함수를 작성했다.

  useEffect(() => {
    socketRef.current = io("서버 주소");
    
    socketRef.current.on("서버와 맞춘 이벤트 이름", (message: string) => {
      setMessages((prevMessages) => [...prevMessages, message]);
    });

    return () => {
      if (socketRef.current) {
        socketRef.current.disconnect();
      }
    };
  }, []);

4. 메세지 전송

.emit("서버와 맞춘 이벤트 이름", InputValue)

서버로 "서버와 맞춘 이벤트 이름" 이벤트와 함께 현재 입력된 메시지(InputValue)를 전송.

아래 예시에선 useState대신 ref를 사용했다.

  const handleSubmit = (e: React.FormEvent) => {
	//...
      socketRef.current?.emit("서버와 맞춘 이벤트 이름", currentInputValue);
      // ...
  };

 

최종 코드

"use client";

import React, { useEffect, useRef, useState } from "react";
import io, { Socket } from "socket.io-client";

const Chat = () => {
  const [messages, setMessages] = useState<string[]>([]);
  const inputValueRef = useRef<HTMLInputElement>(null);
  const socketRef = useRef<Socket | null>(null);

  const handleSubmit = (e: React.FormEvent) => {
    e.preventDefault();
    if (inputValueRef.current) {
      const currentInputValue = inputValueRef.current.value ?? "";
      socketRef.current?.emit("chat message", currentInputValue);
      inputValueRef.current.value = "";
    }
  };

  useEffect(() => {
    socketRef.current = io("http://localhost:3001");

    socketRef.current.on("chat message", (message: string) => {
      setMessages((prevMessages) => [...prevMessages, message]);
    });

    return () => {
      if (socketRef.current) {
        socketRef.current.disconnect();
      }
    };
  }, []);

  return (
    <div>
      <ul>
        {messages.map((message, index) => (
          <li key={index}>{message}</li>
        ))}
      </ul>
      <form onSubmit={handleSubmit}>
        <input ref={inputValueRef} placeholder="메시지를 입력해주세요." />
        <button type="submit">전송</button>
      </form>
    </div>
  );
};

export default Chat;

'React > 라이브러리' 카테고리의 다른 글

React Query v5 바뀐 점  (1) 2023.11.11
Zustand  (0) 2023.07.23
리액트에서 CKEditor5 사용  (0) 2023.07.21
리액트에서 네이버 스마트 에디터 구현  (0) 2023.07.20
[Sanity] CRUD  (0) 2023.06.29
Comments