포스코x코딩온 웹 풀스택 양성과정
[포스코x코딩온] 웹 풀스택 과정 9주차 회고 | Socket.io
Codult
2024. 3. 29. 23:00
728x90

📌 Socket.io
클라이언트와 서버 간의 짧은 지연 시간, 양방향 및 이벤트 기반 통신을 실시간으로 가능하게 하는 라이브러리.
- 웹소켓 프로토콜 기반으로 구축되었다.
- 통신 과정을 단순화하고 개선하기 위한 추가 기능을 제공한다.
- "이벤트 기반", "자동 재연결"
💡 기본 이벤트
connection
클라이언트가 서버에 연결되었을 때 발생한다. (클라이언트와의 상호작용을 초기화 or 초기 데이터를 전달할 수 있음)
disconnect
클라이언트가 연결을 해제했을 때 발생한다.
disconnecting
클라이언트가 연결을 해제하려는 경우에 발생한다.
error
연결 중에 오류가 생겼을 때 발생한다.
💡 사용자 지정 이벤트
socket.emit("이벤트명"[, ...args ])
- 이벤트를 보내는 쪽(socket.emit):
socket.emit("hello", "world", (res) => {
console.log(res);
});
- 이벤트를 받는 쪽(socket.on):
socket.on("hello", (arg, cb) => {
console.log(arg); // "world"
cb("got it"); // "got it"
});
- 보내고 받는 이벤트명은 일치해야 한다.
💡 Socket.io 불러오기 - 서버
- npm 설치
npm install socket.io - 서버에 socket 연결
const http = require('http');
const express = require('express');
const app = express();
const PORT = 8000;
const SocketIo = require('socket.io');
// http 서버 연결
const server = http.createServer(app);
// socket 서버 연결
const io = SocketIo(server);
// 서버 오픈
server.listen(PORT, () => {
console.log(`http://localhost:${PORT}`);
});
💡 Socket.io 불러오기 - 클라이언트
- 서버가 연결되면 브라우저를 통해 socket.io 파일에 접근이 가능하다. (localhost:8000/socket.io/socket.io.js)
<script src="/socket.io/socket.io.js"></script>
- 클라이언트 소켓을 생성한다.
const socket = io();
// io(): 클라이언트 소켓 생성 및 연결 설정
- 이벤트 보내기 (여러 값을 보낼 때, 보통 객체 형태로 보냄)
socket.emit("new_message", { name: "client", message: "서버접속" });
💡 폼이벤트
- 클라이언트
// 폼
<form id="chat">
<input type="text" id="user" placeholder="사용자명" />
<input type="text" id="message" placeholder="채팅 내용" /><br />
<button>채팅</button>
</form>
// 폼이벤트
<script>
const chatForm = document.querySelector("#chat");
const ul = document.querySelector("ul");
const socket = io();
chatForm.addEventLister("submit", (e) => {
e.preventDefault();
const user = chatForm.querySelector('#user');
const message = chatForm.querySelector('#message');
socket.emit(
"new_message",
{ name: user.value, message: message.value },
(res) => {
const li = document.createElement("li");
li.textContent = `${res.name}: ${res.message}`;
ul.appendChild(li);
}
);
});
</script>
- 서버
io.on("connection",(socket) => {
socket.on("new_message", (arg, cb) => {
cb(arg);
});
});
💡 룸 관련 함수
- socket.join("룸이름") : 클라이언트를 특정 방으로 추가한다.
- socket.leave("룸이름"): 클라이언트를 특정 방에서 제거한다.
- io.to("룸이름").emit("이벤트", 데이터): 특정 방에 속한 모든 클라이언트에게, 특정 이벤트와 데이터를 전송한다.
- socket.broadcast.to("룸이름").emit("이벤트",데이터):송신자 클라이언트를 제외한 특정 방에 속한 모든 클라이언트들에게 전달한다.
- io.sockets.adapter.rooms["룸이름"]: 방에 속한 클라이언트의 정보를 출력한다.
<script>
const socket = io();
const chatroom = prompt("채팅방을 입력하세요: ");
// "join" 이벤트 보냄
socket.emit("join", chatroom);
// "userjoin" 이벤트 받음
socket.on("userjoin", (message) => {
console.log(message);
});
// "chat" 이벤트 받음
socket.on("chat", (id, message) => {
const span = document.createElement("span");
span.textContent = message;
if (socket.id === id) {
span.classList.add("right");
} else {
span.classList.add("left");
}
space.appendChild(span);
});
// 폼이벤트 - "message" 이벤트 보냄
chatForm.addEventListenr("submit", (e) => {
e.preventDefault();
const msg = document.querySelector("#message");
socket.emit("message", msg.value);
msg.value = "";
});
</script>
io.on("connection", (socket) => {
socket.on("join", (chatroom) => {
socket.join(chatroom);
socket.room = chatroom; // socket에 room 정보를 추가함
console.log(socket.id); // socket의 고유한 id를 확인할 수 있음
socket.broadcast.to(chatroom).emit("userjoin", chatroom);
});
socket.on("message", (message) => {
io.to(socket.room).emit("chat", socket.id, `${message}`);
});
});
더 많은 Socket.io 관련 함수는 공식 홈페이지에서 확인할 수 있다.
728x90