일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- Testing
- svelte
- e2e
- api test
- ts error
- 선택자
- JavaScript
- TLS
- custom command
- csr
- caching
- 비동기
- Cypress
- msw
- https
- rendering
- vue
- CloudFlare
- SSR
- vue-cli
- typeScript
- QUIC
- ViTE
- http3
- devtools
- import.meta.env
- CSS
- vue3
- aws
- web vital
- Today
- Total
Develop Note by J.S.
[Network] Socket.io vs Websocket 본문
socket이란?
특정 포트에 바인딩 된 소켓을 통해 Server와 Client간의 양방향 데이터 통신을 지원합니다. socket은 프로토콜, IP, Port가 한 구성이 됩니다. 프로토콜에는 연결지향형인 TCP와 비연결지향형인 UDP가 있습니다.
웹에서 주로 사용되는 HTTP프로토콜은 단방향 데이터 통신이며 일반적으로 Client가 Server로 Connection -> Request -> Response -> Disconnect 의 절차로 이루어지는데 빈번한 데이터 통신이 발생될 경우 잦은 Connection/Disconnection으로 비효율적인 문제가 있습니다. 이때 1회 Connection으로 양방향 데이터 송수신이 가능한 웹소켓을 사용할 수 있습니다.
1. WebSocket 특징
1) 웹에서의 소켓통신은 HTML5 웹 표준기능으로 별도의 설치없이 사용할 수 있습니다.
2) 적은 사이즈의 데이터를 빠르게 전달 하고 받기에 적합한 기능입니다. 데이터는 String , Blob, 또는 ArrayBuffer형태의 자료만 데이터로 사용할 수 있습니다.
3) BroadCasting 기능이 없어 연결된 socket Client세션에 For 문을 사용하여 전달하여야 합니다. 주로 주식증권 실시간 차트 등을 예로 들수 있습니다.
4) 연결이 끊켰을 때 연결을 재시도하지 않습니다.
5) JSON데이터의 경우 JSON.stringify, JSON.parse 메서드로 변환하여 전송해야 합니다.
//Websocket 사용시작
const exampleSocket = new WebSocket("ws://www.example.com/socketserver", "protocolOne");
//메세지 송신
exampleSocket.onopen = function (event) { //socket 연결 완료 event
exampleSocket.send("준비완료");
};
//메세지 수신 handler
exampleSocket.onmessage = function (event) {
console.log(event.data);
}
//연결종료
exampleSocket.close();
2. socket.io 특징
1) Websocket 기술을 활용한 양방향 데이터 송수신 라이브러리 입니다. 별도 설치후 사용가능합니다.
2) 연결이 끊켰을 때 reConnection 시도를 합니다.
3) Broadcasting 을 지원합니다. 따라서 카카오톡 메신저와 같이 특정 채팅방 전원에게 메세지 전송이 필요한 경우에 socket.io를 사용하기 적합합니다.
4) JSON 데이터를 그대로 전송할 수 있습니다.
npm i --save express socket.io
- backend
//socket.js
const SocketIO = require("socket.io");
module.exports = (server) => {
const io = SocketIO(server, { path: "/socket.io" });
io.on("connection", (socket) => {
socket.on("chat message", (msg) => {
io.emit("chat message", msg);
});
});
};
//app.js
const express = require("express");
const app = express();
const Socket = require("./socket");
const server = app.listen(3000, () => {
console.log("listening port 3000");
});
Socket(server); //socket사용
- frontend
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>Socket</title>
</head>
<body>
<script src="/socket.io/socket.io.js"></script>
<script>
var socket = io();
// socket receive Handler
socket.on('message', (data) => {
//수신 이후 login
//송신방법
socket.emit('message', data);
});
</script>
</body>
</html>
PS. Websocket, socket.io 모두 장단점이 있기에 서비스가 요구하는 퍼포먼스를 낼 수 있는 기능을 때에 따라 선택하여 사용하시면 됩니다.
참고사이트
https://coding-maggot.tistory.com/80
https://fred16157.github.io/node.js/nodejs-socketio-communication-basic/
'Knowledge > Network' 카테고리의 다른 글
[Network] OSI 7계층 & TCP/IP 4계층 (0) | 2023.08.08 |
---|---|
[Network] HTTP (0) | 2023.07.03 |
[Network] API Architecture (0) | 2023.06.27 |
[Network] HTTPS (0) | 2023.06.26 |