[쉘위헬스] socket.io 채팅방 생성하기
먼저 구현하기에 앞서 Socket.io란 무엇인지 정리해보고자 한다
socket.io란?
- 양방향 통신을 하기 위해 웹소켓 기술을 활용하는 라이브러리이다
- 클라이언트 라이브러리와 서버 라이브러리가 다르다 (socket.io-client , socket.io)
- 자바스크립트를 이용해서 브라우저에 상관없이 실시간 웹을 구현할 수 있다
- 현존하는 대부분의 실시간 웹 기술들을 추상화해 놓았다
Websocket, flashSocket, ajax, long poling, ajax muti streaming, IFrame, Json Poling 등
- 웹 브라우저와 웹 서버의 종류와 버전을 파악하여 가장 적합한 기술을 선택하여 사용한다
웹소켓에 비하여 자체적으로 브로드캐스팅이 가능하고
웹소켓의 사용을 단순화 하여 사용할 수 있고, 자바스크립트로 구현할 수 있기때문에 socket.io를 선택하여 양방향통신 기능을 구현하였다.
이전에 View페이지(게시글) 에서 채팅하기 버튼을 누른 뒤 채팅방이 생성되면 실시간소통으로 메세지를 주고 받을 수 있도록 설정하였다.
// view에서 연결한 socket을 props로 Chat에게 전달
<Chat data={data} postId={postNumber} socket={socket} />
Client
채팅창에서 Enter
와 click
입력 될 경우 아래와 같은 일들이 실행될 수 있는 함수를 만들었다.
1. socket.io 핸들러 호출
2. axios 서버 db저장
message 전송 시 실행되는 함수
const sendMessage = async (e) => { if (e.key === 'Enter' && content !== '') { await socketMessage(); //socket.io 서버전달 핸들러 호출 await handleSendMessage(); // 메세지 db 저장 } if (e.type === 'click' && content !== '') { await socketMessage(); //socket.io 서버전달 핸들러 호출 await handleSendMessage(); // 메세지 db 저장 } };
데이터 배열에 저장 하고 보내기
emit 으로 'send_message' 라는 이름으로 생성된
messageData
전송const socketMessage = async () => { const messageData = { room: postId, authorId: id, content: content, time: new Date() }; setMessageList((list) => [...list, messageData]);// 화면에 랜더링되는 배열 await socket.emit('send_message', messageData); };
useEffect로 데이터 받아오기
상대방에게서 메세지를 받아오게 될 경우 실행 된다
useEffect(() => { socket.on('receive_message', (data) => { setMessageList((list) => [...list, data]); // 화면에 랜더링되는 배열 }); }, [socket]);
Server (백엔드 팀원분 작성코드)
서버에서는 클라이언트에서
emit
으로 전달해주면on
으로 받은 뒤emit
으로 다시 값을
전달해주어서 메세지가 오고 갈 수 있도록 해주었다io.on("connection", (socket) => { console.log(`User conneced: ${socket.id}`); socket.on("join_room", (data) => { socket.join(data); console.log(`User with Id: ${socket.id} joined room: ${data}`); }); socket.on("send_message", (data) => { const messageData = formatMessage(data.authorId, data.content, data.time); console.log(messageData); socket.to(data.room).emit("receive_message", messageData); }); socket.on("disconnect", () => { console.log("User Disconnected, socket.id"); }); });
마치며,
평소에 실생활에서 쉽게 볼 수 있는 기능을 양방향통신 기능을 구현하려고 자료를 찾아보았더니
웹소켓, socket.io 라는 단어들을 접할 수 있었고 공부를 하여서 기능을 마무리 지었어야했다
처음 접한내용이다보니 생소한 단어들도 많았고 정말 많은 글들을 읽었지만 아직까지 완벽하게 이해하지는 못한것같다
브로드캐스팅이라는 단어가 어떤뜻인지는 알겠지만 설명하기 어려운 부분이였는데 서로 지정된 공간끼리는 공유 할 수 있도록 쉽게 연결해주는 기능이라고 이해했다.
그래도 이전에 모르던 때와 비교해서는 웹소켓과 소켓아이오의 차이점도 알게되었고
기능구현도 마무리 할 수 있었다
Author And Source
이 문제에 관하여([쉘위헬스] socket.io 채팅방 생성하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@sssssssssy/socket.io-fv86yzko저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)