Socket.IO ๋?
Node.js
๊ธฐ๋ฐ์ผ๋ก ๋ธ๋ผ์ฐ์ ์ ์๋ฒ ๊ฐ์ ์ค์๊ฐ ์๋ฐฉํฅ ์ด๋ฒคํธ ๊ธฐ๋ฐ ํต์ ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. WebSocket์ ์ง์ํ์ง ์๋ ๋ธ๋ผ์ฐ์ ๋ ์ง์ํ๋ฉฐ ๋ฉํฐ ๋๋ฐ์ด์ค(web, android, ios, windows)๋ฅผ ์ง์ํ๋ ํน์ง์ด ์๋ค. ์ฆ, ๋ธ๋ผ์ฐ์ ๊ฐ WebSocket์ ์ง์ํ๋ฉด ์ผ๋ฐ WebScoket ๋ฐฉ์์ผ๋ก ๋์ํ๊ณ ๊ฐ๋จํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ๋์์ฃผ๋ฉฐ, ์ง์ํ์ง ์๋ ๋ธ๋ผ์ฐ์ ๋ฉด HTTP ๋กฑ ํด๋ง ๋ฐฉ์์ผ๋ก ๋์ฒดํ๋ค.
๋กฑ ํด๋ง(Long polling)
์ฃผ๊ธฐ์ ์ผ๋ก ๋ฌดํํ ๋ฌผ์ด๋ณด๋ polling ๋ฐฉ์๊ณผ๋ ๋ฌ๋ฆฌ long polling์ Request๋ฅผ ๋ณด๋ด๊ณ Time out ๋ ๋๊น์ง ๋ฌดํ์ ๊ธฐ๋ค๋ฆฐ๋ค. Time out์ด ๋์ด ์๋ฒ๊ฐ ๋์ ๋ Client๋ ์ฌ์ฐ๊ฒฐํ๋ค. ์๋ฒ๋ก๋ถํฐ ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๊ฐ ์์ด Response๊ฐ ์จ๋ค๋ฉด ๋ฐ๋ก client์๊ฒ ์ ๋ฌํ๊ณ ์ฐ๊ฒฐ์ด ์ข ๋ฃ๋๋ค. Client๋ ์ ๋ณด๋ฅผ ๋ฐ๋ ์ฆ์ ๋ค์ Request๋ฅผ ๋ณด๋ด๋ ์์ผ๋ก ํ์ฌ ์ฐ๊ฒฐ์ ๋ฌดํํ ์ง์๋๋ฉฐ Client๋ ์ค์๊ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค.
๋ค๋ง ๋ค์์ ํด๋ผ์ด์ธํธ์๊ฒ ๋์์ ์ด๋ฒคํธ๊ฐ ๋ฐ์๋๋ ๊ฒฝ์ฐ ์๋ฒ์ ๋ถ๋ด์ด ๊ธ์ฆํ์ฌ ๋ค์์ ์ฌ์ฉ์๊ฐ ๋์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ์ ํฉํ์ง ์๋ค. ๋ํ ์์ฒญ ๊ฐ๊ฒฉ์ด ์ค์ด๋๋ฉด polling ๋ฐฉ์๋ณด๋ค ๋ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๊ฒ ๋๋ค.
WebSocket
์น ๋ธ๋ผ์ฐ์ ๋ http ํ๋กํ ์ฝ์ ๊ธฐ๋ฐ์ผ๋ก Request/Response๋ก ๋์ํ๋๋ฐ ์ค์๊ฐ ํต์ ์ ๋ถ๊ฐ๋ฅํ๋ค. Websocket์ ์น ์๋ฒ์ ์น ๋ธ๋ผ์ฐ์ ๊ฐ ์ค์๊ฐ ์๋ฐฉํฅ ํต์ ํ๊ฒฝ์ ์ ๊ณตํด์ฃผ๋ ์ค์๊ฐ ํต์ ๊ธฐ์ ์ด๋ค. WebSocket์ ์น ๋ธ๋ผ์ฐ์ ๋ง ์ง์ํ๊ธฐ ๋๋ฌธ์ Socket.io ๋ฅผ ์ฌ์ฉํ์ฌ ์น ๋ธ๋ผ์ฐ์ ์ง์ ์ฌ๋ถ์ ๋ฐ๋ผ webSocket์ ์ฌ์ฉ/long polling ์ฌ์ฉ ๋ชจ๋ ์ง์ํ ์ ์๋ค.
TCP Socket๊ณผ ๋ค๋ฅธ ์ ์ ์ฒ์ ์ ์์ด http request์ handshaking ๊ณผ์ ์ ํตํด ์ด๋ฃจ์ด์ง๋ค๋ ์ ์ด๋ค. http request๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ์ฌ ๊ธฐ์กด์ 80, 443 ํฌํธ๋ก ์ ์ํ๋ค.
Socket.IO Function
socket.emit(eventName[, ...args][, ack])
- eventName์ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํจ๋ค. args์ ์ ๋ฌํ๊ณ ์ ํ๋ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๋ค.
socket.emit("ferret", "tobi", (data) => {
console.log(data); // data will be "woot"
});
// server:
// io.on("connection", (socket) => {
// socket.on("ferret", (name, fn) => {
// fn("woot");
// });
// });
socket.send([...args][, ack])
emit
๊ณผ์ ์ฐจ์ด์ ์eventName
์ด ์๋ค๋ ๊ฒ์ด๋ค.eventName
์message
๋ก ๊ณ ์ ๋์ด `emit(โmessageโ,[..args])์ ๊ฐ์ ์ญํ ์ ํ๋ค.
socket.on(eventName, callback)
emit
์ผ๋ก ๋ฐ์์ํจeventName
์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ๋ฑ๋กํ๋ค.
socket.on("news", (data) => {
console.log(data);
});
// with multiple arguments
socket.on("news", (arg1, arg2, arg3, arg4) => {
// ...
});
// with callback
socket.on("news", (cb) => {
cb(0);
});
socket.once(eventName, callback)
eventName
์ ์ผํ์ฑ ์ด๋ฒคํธ ํธ๋ค๋ฌ์ด๋ค. ๋ค์์ ํ๋ฒ ๋eventName
์ด๋ฒคํธ๊ฐ ํธ๋ฆฌ๊ฑฐ๋๋ฉด ์ด ๋ฆฌ์ค๋๊ฐ ์ ๊ฑฐ๋ ๋ค์ ํธ์ถ๋๋ค.socket.once("my-event", () => { // ... });
socket.onAny(callback)
eventName
๊ณผ ์๊ด์์ด ํฌ๊ด์ ์ผ๋ก ์ด๋ฒคํธ๋ฅผ ์์ ํ๋ค. ๋ชจ๋ ์ด๋ฒคํธ๊ฐ ์์ ๋ ๋๋ง๋ค ์๋ํ๋ค. ์๋ ์ฝ๋์ ๊ฐ์ดevent
์ ์์ ํ ์ด๋ฒคํธ์eventName
์ด ํ ๋น๋๊ณ ,args
์ ์์ ํ ์ด๋ฒคํธ์ ๋ฐ์ดํฐ๊ฐ ํ ๋น๋๋ค.webSocket
์onMessage
์ ๊ฐ์ ์ญํ ์ ํ๋ค.socket.onAny((event, ...args) => { console.log(`got ${event}`); });
Socket.IO ์ฌ์ฉ๋ฒ
๊ฐ๋จํ Client, Server ์์ ๋ก ์์ฒญ/์๋ต์ ์ฃผ๊ณ ๋ฐ๋ ์ฝ๋์ด๋ค.
Client ์ธก
1. socket.io ๊ฐ์ฒด ์์ฑ
const io = require("socket.io-client");
const socketClient = io("http://127.0.0.1:20111");
๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์ฐ๊ฒฐํ ์๋ฒ๋ฅผ ์ค์ ํ๋ค.
2. ์ฐ๊ฒฐ ์ด๋ฒคํธ ์ฒ๋ฆฌ
socketClient.on("connect",()=>{
console.log("Connect server by Socket.io");
});
์ฐ๊ฒฐ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ์์ ๊ฐ์ ๋ฌธ๊ตฌ๋ฅผ ์ฝ์ ์ฐฝ์ ์ถ๋ ฅํ๋ค. ๋ค์๊ณผ ๊ฐ์ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค.
connect
: ์ฐ๊ฒฐ ์ฑ๊ณตdisconnect
: ์ฐ๊ฒฐ ์ข ๋ฃerror
: ์๋ฌ ๋ฐ์- ์ฌ์ฉ์ ์ ์ ์ด๋ฒคํธ
3. ์ด๋ฒคํธ ๋ฐ์
socketClient.emit("request",{data:"Send Request"});
emit
ํจ์๋ฅผ ์ด์ฉํ์ฌ request
์ด๋ฆ๊ณผ Send Request
๋ด์ฉ์ ๋ด์ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํจ๋ค.
4. response ์ด๋ฒคํธ ์ฒ๋ฆฌ
socketClient.on("response",req =>{
console.log(req);
});
response
๋ผ๋ ์ด๋ฆ์ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ ๋ ํด๋น ์ด๋ฒคํธ์ ๋ด์ฉ์ req
๋ก ๋ฐ์์ ์ฝ์ ์ฐฝ์ ์ถ๋ ฅํ๋ค.
OUTPUT
Connect server by Socket.io
{ data: 'Recieve Respond' }
Server ์ฝ๋๊ฐ ์คํ๋๋ฉด ์์ ๊ฐ์ด ์๋ฒ ์ธก์์ ๋ณด๋ธ ์๋ต์ด ์ถ๋ ฅ๋๋ค.
Server ์ธก
1. http ์๋ฒ, socket.io ๊ฐ์ฒด ์์ฑ
const http = require('http');
const io = require("socket.io");
const httpServer = new http.Server();
const socketServer = io(httpServer);
socket.io ๊ฐ์ฒด์ ์ฐ๊ฒฐํ http ์๋ฒ๋ฅผ ์ค์ ํ๋ค.
2. http ์๋ฒ ๊ตฌ๋
httpServer.listen(20111, '127.0.0.1', () => {
console.log('socket server listend: ', `http://127.0.0.1:20111`);
});
client์์ ์ค์ ํ ๋์ผํ ํฌํธ ๋ฒํธ์ ๊ฒฝ๋ก๋ฅผ ์ค์ ํด socket ์ฐ๊ฒฐ์ ๊ธฐ๋ค๋ฆฐ๋ค.
3. ์ด๋ฒคํธ ์ฒ๋ฆฌ
socketServer.on('connection', socket => {
console.log("Connect client by Socket.io");
socket.on("request", req => {
console.log(req);
socket.emit("response", { data: "Send Respond" });
});
});
client์ ์ฐ๊ฒฐ๋๋ฉด Connect client by Socket.io
๋ฅผ ์ฝ์์ฐฝ์ ์ถ๋ ฅํ๋ค. request
์ด๋ฒคํธ๋ฅผ ๋ฐ์ผ๋ฉด ํด๋น ๋ด์ฉ์ ์ฝ์ ์ฐฝ์ ์ถ๋ ฅํ๊ณ ์๋ฐ์๋ค๋ ์ด๋ฒคํธ์ธ response
๋ฅผ ๋ฐ์์ํจ๋ค.
OUTPUT
socket server listend: http://127.0.0.1:20111
server ์ฝ๋๋ฅผ ์คํํ๋ฉด ์์ง client ์ฝ๋๋ฅผ ์คํํ์ง ์์์ผ๋ฏ๋ก ์์ ๊ฐ์ด listen์ ์คํํ ์ฝ๋๋ง ์ถ๋ ฅ๋๋ค.
Connect client by Socket.io
{ data: 'Send Request' }
client์ฝ๋๋ฅผ ์คํํ๋ฉด ์์ ๊ฐ์ด ์์ ํ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ ์ฝ๋๊ฐ ์ถ๋ ฅ๋๋ค.
client.js ์ ์ฒด ์ฝ๋
const io = require("socket.io-client");
const socketClient = io("http://127.0.0.1:20111");
socketClient.on("connect",()=>{
console.log("Connect server by Socket.io");
});
socketClient.emit("request",{data:"Send Request"});
socketClient.on("response",req =>{
console.log(req);
});
server.js ์ ์ฒด ์ฝ๋
const http = require('http');
const io = require("socket.io");
const httpServer = new http.Server();
const socketServer = io(httpServer);
httpServer.listen(20111, '127.0.0.1', () => {
console.log('socket server listend: ', `http://127.0.0.1:20111`);
});
socketServer.on('connection', socket => {
console.log("Connect client by Socket.io");
socket.on("request", req => {
console.log(req);
socket.emit("response", { data: "Recieve Respond" });
});
});