[Web] Socket, WebSocket (μμΌκ³Ό μΉμμΌ)
νλ‘μ νΈλ₯Ό μ§ννλ©΄μ μμΌμ μ λ§ λ§μ΄ μ¬μ©νκ² λμμλ€. μκ°μ΄ κ½€ μ§λ¬μ§λ§ λ€μ νλ² νμ΅ν΄λ³΄λ©΄μ 볡기λ νκ³ λλ¦λλ‘ μ 리λ ν΄λ³΄λ €κ³ ν¬μ€νΈλ₯Ό μμ±νκΈ° μμνλ€!
π Socket
- νλ‘κ·Έλ¨μ΄ λ€νΈμν¬μμ λ°μ΄ν°λ₯Ό μ£Όκ³ λ°μ μ μλλ‘ λ€νΈμν¬ νκ²½μ μ°κ²°ν μ μκ² λ§λ€μ΄μ§ μ°κ²°λΆ
- λ°μ΄ν°λ₯Ό μ£Όκ³ λ°μ μ μλ κ΅¬μ‘°μ²΄λ‘ μμΌμ ν΅ν΄ λ°μ΄ν° ν΅λ‘κ° λ§λ€μ΄μ§λ€.
- μλ² μμΌ, ν΄λΌμ΄μΈνΈ μμΌμΌλ‘ ꡬλΆλλ€. (μμ²μ νλ μͺ½μ΄ ν΄λΌμ΄μΈνΈ, λ°λ μͺ½μ΄ μλ²)
- TCP/IP, UDP/IP μ νμ΄ μ‘΄μ¬νλ μΌλ°μ μΌλ‘ TCP/IP νλ‘ν μ½μ μ΄μ©ν¨.
- μμΌμ ν΄λΌμ΄μΈνΈμ μλ²κ° λ°μ΄ν° ν¨ν·μ κ΅νν μ μλλ‘ νλ IP μ£Όμμ ν¬νΈ λ²νΈλΌκ³ νλ ν΅μ μ© λμ (End-Point)μ λ§λ€μ΄ μλ
π λμλ°©μ
β Server
- socket(): μμΌ μμ±(TCPλ stream)
- μλ‘μ΄ clientμ μμ²μ λκΈ°νκΈ° μν¨
- bind(): μ¬μ©ν IP addressμ Port number λ±λ‘
- ν¬νΈ λ²νΈκ° λ€λ₯Έ μμΌμ ν¬νΈ λ²νΈμ μ€λ³΅λμ§λ μμκΉ?
- μ΄μ체μ μμλ μμΌλ€μ΄ μ€λ³΅λ ν¬νΈ λ²νΈλ₯Ό μ¬μ©νμ§ μλλ‘, λ΄λΆμ μΌλ‘ ν¬νΈ λ²νΈμ μμΌ μ°κ²° μ 보λ₯Ό κ΄λ¦¬νλ€.
- listen(): μ°κ²° λμ§ μμ μμΌμ μμ² μμ λκΈ° λͺ¨λλ‘ μ ν(Block μν)
- accept(): clientμ μμ²dmf μλ½ → ν΅μ μ μν μλ‘μ΄ μμΌ μμ±(μ€μ§μ μΈ μμΌ μ°κ²°)
β Client
- socket(): λ§μ°¬κ°μ§λ‘ μμΌ μμ±(TCPλ stream)
- connect(): Clientμμ Serverμ μ°κ²°νκΈ° μν΄ μμΌκ³Ό λͺ©μ μ§ IP address, Port number μ§μ (Block μν)
β Server-Client
- send(), recv(): Clientλ μ²μμ μμ±ν μμΌμΌλ‘, Serverλ μλ‘ λ°ν(μμ±)λ μμΌμΌλ‘ clientμ serverκ°μ λ°μ΄ν° μ‘μμ
- close(): μμΌμ λ«μ
π WebSocket
μμΌμ λ μ»΄ν¨ν° κ°μ ν΅μ μ μ€μ νκΈ° μν κΈ°λ³Έ λ©μ»€λμ¦μ μ 곡νλ λ°λ©΄ μΉ μμΌμ μμΌ μμ ꡬμΆλμ΄ μΉ ν΄λΌμ΄μΈνΈμ μλ² κ°μ μ€μκ° μ μ΄μ€ ν΅μ μ μν μμ μμ€ νλ‘ν μ½μ μ 곡νλ κ²μ΄ μ°¨μ΄μ μ΄λ€. (μΉ μμΌμ HTTP λ μ΄μ΄μμ λμ, μμΌμ TCP/IP)
μΉμμΌμ HTTPλ‘ μ€μκ° ν΅μ μ νλ κ²μ΄ μ΄λ €μ κΈ° λλ¬Έμ ν΄κ²°μ± μΌλ‘ λμ¨ κΈ°μ μ΄λ€.
HTTP μ€μκ° ν΅μ μ μ΄λ €μ΄ μ΄μ
1. λΉμ°κ²°μ±μΌλ‘ μΈν λ¨λ°©ν₯ ν΅μ
2. λΉμ°κ²°μ±μΌλ‘ μΈν λ§€λ² μ°κ²° λ§Ίκ³ λλ κ³Όμ μ λΉμ©
3. request-response μ ꡬ쑰
4. ν€λμ λΉμ€μ΄ λ무 νΌ
π λμλ°©μ
λ¨Όμ μμΌ μ°κ²°μ νκΈ° μν΄ νΈλμμ΄νΉμ΄ νμνλ€ μ΄λ HTTP λλ HTTPS νλ‘ν μ½μ ν΅ν΄ μ΄λ£¨μ΄μ§λ€.
ν΄λΌμ΄μΈνΈμ μμ² ν€λ
GET /chat HTTP/1.1
Host: example.com:8000
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Sec-WebSocket-Version: 13
- Method: λ°λμ GET μμ²μΌλ‘ 보λ΄μΌ ν¨.
- Host: μΉμμΌ μλ²μ μ£Όμ
- Upgrade: νμ¬ νλ‘ν μ½μμ λ€λ₯Έ νλ‘ν μ½λ‘ μ κ·Έλ μ΄λ, λ³κ²½νκΈ° μν¨(webSocket νλ‘ν μ½λ‘ λ³ν)
- Connection: Upgrade νλκ° λͺ μλμ΄μλ€λ©΄, Connection νλλ λͺ μν΄μ€μΌ ν¨.
- Sec-WebSocket-Key: κΈΈμ΄κ° 16 λ°μ΄νΈμΈ μμμ κ°μΌλ‘ ν΄λΌμ΄μΈνΈμ μλ²κ° μ μμ μΈμ¦νλλ° μ¬μ©
μ΄μΈμλ ν΄λΌμ΄μΈνΈλ μ¬λ¬ λ©μΈμ§λ μλΈνλ‘ν μ½μ μΆκ°ν΄ λ³΄λΌ μλ μλ€. (User-Agent, Referer, Cookie λ±) μνλ λλ‘ μμ²μ 무μμ΄λ μ§ μ²¨λΆνμ¬ λ³΄λΌ μ μμ§λ§ μΉμμΌκ³Ό κ΄λ ¨μ΄ μμ κ²½μ° λ¬΄μνλ€.
μλ²μ μλ΅ ν€λ
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
101 Switching ProtocolsμΌλ‘ μλ΅μ΄ μ€λ©΄ μΉμμΌμ΄ μ°κ²°λμλ€λ μλ―Έμ΄λ€.
ν΄λΌμ΄μΈνΈκ° λ³΄λΈ ν€λκ° μλͺ»λ κ°μ κ°μ§κ±°λ νμμ΄ μλͺ»λ ν€λμ κ²½μ°, μλ²λ "400 Bad Request (en-US)" μλ΅μ λ³΄λ΄ μ¦μ μμΌμ μ’ λ£μν¨λ€.
μ΄λ° κ³Όμ μ ν΅ν΄μ νλ‘ν μ½μ΄ ws, wss(WebSocket)μΌλ‘ λ³νλλ©΄ frameμ μ¬μ©νμ¬ λ°μ΄ν°λ₯Ό κ΅νν μ μλ€.
Frame
WebSocketμ λ°μ΄ν° κ΅νμμ μ¬μ©λλ κ°μ₯ μμ λ¨μμ λ°μ΄ν°λ‘ ν€λμ νμ΄λ‘λλ‘ κ΅¬μ±λμ΄ μλ€.
Frame Header
ν€λλ μΌλ°μ μΌλ‘ κΈΈμ΄κ° 2λ°μ΄νΈμ΄μ§λ§ λμ©λ νμ΄λ‘λμ κ²½μ° μ΅λ 14λ°μ΄νΈκΉμ§ κ°λ₯νλ€.
1. 첫 λ²μ§Έ λ°μ΄νΈμ ν¬ν¨λλ μ 보
- FIN: μ΄κ²μ΄ λ©μμ§μ λ§μ§λ§ μ‘°κ°μΈμ§ μ¬λΆλ₯Ό λνλ λλ€.
- RSV1, RSV2, RSV3: νμ₯μ μ¬μ©ν μ μλ μμ½λ λΉνΈ
- Opcode: νμ΄λ‘λ μ ν μ§μ (μ: ν μ€νΈ, λ°μ΄λ리, ν λ±)
2. λ λ²μ§Έ λ°μ΄νΈ ν¬ν¨λλ μ 보(νμ΄λ‘λμ κ΄ν¨)
- Mask: νμ΄λ‘λ λ§μ€νΉ μ¬λΆ νμ
- νμ΄λ‘λ κΈΈμ΄: νμ΄λ‘λμ κΈΈμ΄ μ§μ
Frame Payload
νμ΄λ‘λμλ WebSocket μ°κ²°μ ν΅ν΄ μ μ‘λλ μ€μ λ°μ΄ν°κ° ν¬ν¨λλ€. νμ΄λ‘λκ° λ§μ€νΉλ κ²½μ°(ν€λμ λ§μ€ν¬ νλκ·Έλ‘ νμλ¨) ν€λμλ ν¬ν¨λ λ§μ€νΉ ν€μ XOR μ²λ¦¬λλ€.
νμ΄λ‘λμ κΈΈμ΄λ ν€λμ μ§μ λ νμ΄λ‘λ κΈΈμ΄μ λ°λΌ κ°λ³ κΈΈμ΄μΌ μ μλ€.
λ§μ½ νμ΄λ‘λ κΈΈμ΄κ° 125λ°μ΄νΈ μ΄νμ΄λ©΄ νλ μμ μ§μ μ μ₯λμ§λ§ νμ΄λ‘λ κΈΈμ΄κ° 125λ°μ΄νΈλ³΄λ€ ν¬λ©΄ νμ΄λ‘λ κΈΈμ΄ νλλ 126 λλ 127λ‘ μ€μ λκ³ νμ΄λ‘λμ μ€μ κΈΈμ΄λ ν€λ λ€μ μ€λ λ³λμ νλμ μ μ₯λλ€.
Frame μ’ λ₯
Continuation Frames Text Frames UTF-8λ‘ μΈμ½λ©λ ν μ€νΈ λ°μ΄ν°λ₯Ό μ μ‘νκΈ° μν΄ μ¬μ© Binary Frames λ°μ΄λ리 λ°μ΄ν°λ₯Ό μ μ‘νκΈ° μν΄ μ¬μ© Close Frames μ°κ²°μ λ«μμΌ νλ€λ μ νΈλ₯Ό 보λ΄λ λ° μ¬μ© Ping Frames μ°κ²°μ΄ μ¬μ ν νμ± μνμΈμ§ ν μ€νΈνλ λ° μ¬μ© Pong Frames Ping νλ μμ μλ΅νκ³ μ°κ²°μ΄ μ¬μ ν νμ± μνμμ λνλ΄λ λ° μ¬μ©
π nodeμμ μΉμμΌ μ¬μ©νκΈ°
μ€λλ λΈλΌμ°μ μ κ²½μ° μ§μνμ§ μλ κ²½μ° μ‘΄μ¬νκΈ° λλ¬Έμ Cross-platform WebSocket APIμΈ Socket.ioλ₯Ό μ¬μ©νλ€.
on('λ©μλλͺ ', μ½λ°±ν¨μ(data){}) | μμΌ μ°κ²°λ μλνΈ(λΈλΌμ°μ / μλ²)μμ λ©μλλͺ μ λ§€κ°λ³μλ‘ κ°λ emit νΈμΆνλ©΄ μ΄ν μ½λ°±ν¨μκ° λμνλ€. emit λ©μλμ λ§€κ°λ³μλ₯Ό dataλ‘ λ°μμ μ μ ν λμμ μννλ€. |
on('connection', function(socket)) | μμΌ μ°κ²°μ μν΄ νμμ μΌλ‘ μνλμ΄μΌ νλ ν¨μ.jQueryμμ $().ready()μ κ°μ λλμΌλ‘ μ¬μ©νλ©΄ λλ€.functionμ λ§€κ°λ³μλ‘ μμΌ κ°μ²΄λ₯Ό μ¬μ©ν μ μλ€. |
emit('λ©μλλͺ ', data) | μμΌ μ°κ²°λ μλνΈ(λΈλΌμ°μ / μλ²)μμ λ©μλλͺ μ κ°λ on ν¨μλ₯Ό νΈμΆ νλ€. μ΄λ on ν¨μμ νμν λ°μ΄ν°λ₯Ό dataλ‘ ν¨κ» μ μ‘νλ€. |
join("곡κ°λͺ ") | '곡κ°λͺ 'μ ν€λ‘ ν΄ μμΌλ€μ κ΄λ¦¬ν μ μκ² ν΄μ£Όλ λ©μλ. |
Client
import { Socket } from 'socket.io-client';
const socket = Socket.connect();
// μμΌμ΄ μ°κ²°μ΄ λ¨
socket.on('connect', () => console.log('socket connect!'))
// μλ²λ‘λΆν° λ°μ λ°μ΄ν° μΆλ ₯
socket.on('μ΄λ²€νΈμ΄λ¦', data => console.log(data));
// μλ²λ‘ μ μ‘
socket.emit('μ΄λ²€νΈμ΄λ¦', {λ°μ΄ν°});
Server
const httpServer = http.createServer(app);
const io = new Server(httpServer);
// μμΌ μ°κ²°λ¨
io.on('connection', socket => {
// ν΄λΌμ΄μΈνΈμκ² λ°μ΄ν°λ₯Ό λ°κ³ μΆλ ₯
socket.on('μ΄λ²€νΈμ΄λ¦', data => console.log(data));
// λͺ¨λ ν΄λΌμ΄μΈνΈμκ² λ©μμ§λ₯Ό μ μ‘
socket.broadcast.emit('μ΄λ²€νΈμ΄λ¦', {λ³΄λΌ λ°μ΄ν°});
// νΉμ ν΄λΌμ΄μΈνΈμκ² μ μ‘
socket.to(id).emit('μ΄λ²€νΈμ΄λ¦', {λ³΄λΌ λ°μ΄ν°})
});
μΆκ°μ μΈ λ©μλλ μκ³ μ΄λ―Έ λ±λ‘λμ΄ μλ μ΄λ²€νΈλ€λ μλλ° μμΈν건 곡μλ¬Έμμμ μ°Έκ³ νλ©΄ μ’μ κ² κ°λ€!
Introduction | Socket.IO
What Socket.IO is
socket.io
μλͺ»λ λ΄μ©μ΄ μλ€λ©΄ νΈνκ² λ§μλΆνλ립λλ€!!!
π μ°Έκ³
https://www.youtube.com/watch?v=MPQHvwPxDUw
https://poiemaweb.com/nodejs-socketio
Node.js(Express)μ Socket.io | PoiemaWeb
WebSocket, Socket.ioλ₯Ό μ¬μ©ν μ€μκ° μ±ν μ ν리μΌμ΄μ
poiemaweb.com
https://on1ystar.github.io/socket%20programming/2021/03/16/socket-1/
μμΌ νλ‘κ·Έλλ° - μμΌμ μλ―Έ/νΉμ§/μ’ λ₯ · on1ystar
μμΌ νλ‘κ·Έλλ° - μμΌμ μλ―Έ/νΉμ§/μ’ λ₯ 16 Mar 2021 μλ¬Έμ μ΄λ μ§μ λ±μ κ΄μ¬ λ° μ‘°μΈμ μν λκΈμ΄λ λ©μΌμ μΈμ λ νμμ΄κ³ κ°μ¬ν©λλ€. Socket λ Όλ¦¬μ μΈ μλ―Έλ‘ μ»΄ν¨ν° λ€νΈμν¬λ₯Ό κ²½μ ν
on1ystar.github.io