์ค์๊ฐ ์๋ฐฉํฅ ๋ฐ์ดํฐ ์ ์ก์ ์ํ ๊ธฐ์
โ ํด๋ง(polling)
์น ์์ผ ์ด์ ์๋ HTTP ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ์ค์๊ฐ ๋ฐ์ดํฐ ์ ์ก ๊ตฌํํ๊ณ , ๋ํ์ ์ธ ๋ฐฉ๋ฒ์ด ํด๋ง์ด๋ค.
HTTP๊ฐ ํด๋ผ์ด์ธํธ์์ ์๋ฒ๋ก ํฅํ๋ ๋จ๋ฐฉํฅ ํต์ ์ด๋ฏ๋ก ์ฃผ๊ธฐ์ ์ผ๋ก ์๋ฒ์ ์๋ก์ด ์ ๋ฐ์ดํธ๊ฐ ์๋์ง ์์ฒญ ๋ณด๋ธ ํ, ์๋ค๋ฉด ๊ฐ์ ธ์ค๋ ๋จ์ ๋ฌด์ํ ๋ฐฉ๋ฒ.
โ ์๋ฒ์ผํธ ์ด๋ฒคํธ(Server Sent Events, SSE)
EventSource ๊ฐ์ฒด ์ฌ์ฉ
์ฒ์์ ํ ๋ฒ๋ง ์ฐ๊ฒฐํ๋ฉด ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์ ์ง์์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ธ๋ค. ์น ์์ผ๊ณผ์ ๋ค๋ฅธ ์ ์ ํด๋ผ์ด์ธํธ์์๋ ์๋ฒ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ์ ์๋ค.
์น ์์ผ์ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
//socket.js
const WebSocket=require('ws');
module.exports = (server) => {
const wss = new WebSocket.Server({server}); //์ต์คํ๋ ์ค ์๋ฒ๋ฅผ ์น ์์ผ ์๋ฒ์ ์ฐ๊ฒฐ
//์น์์ผ ์๋ฒ์ ์ด๋ฒคํธ ๋ฆฌ์ค๋ ๋ถ์ด๊ธฐ
wss.on('connection', (ws, req) => { //์น์์ผ ์ฐ๊ฒฐ ์
//ํด๋ผ์ด์ธํธ ip ์์๋ด๊ธฐ
const ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
console.log('์๋ก์ด ํด๋ผ์ด์ธํธ ์ ์', ip);
ws.on('message', (message) => { //ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๋ฉ์์ง ์์ ์
console.log(message);
});
ws.on('error', (error) => { //์๋ฌ ์
console.error(error);
});
ws.on('close', () => { //์ฐ๊ฒฐ ์ข
๋ฃ ์
console.log('ํด๋ผ์ด์ธํธ ์ ์ ํด์ ', ip);
clearInterval(ws.interval);
});
ws.interval = setInterval(() => { //3์ด๋ง๋ค ํด๋ผ์ด์ธํธ๋ก ๋ฉ์์ง ์ ์ก
if(ws.readyState === ws.OPEN){
ws.send('์๋ฒ์์ ํด๋ผ์ด์ธํธ๋ก ๋ฉ์์ง๋ฅผ ๋ณด๋
๋๋ค.');
}
}, 3000);
});
};
ws ํจํค์ง๋ ๊ฐ๋จํ๊ฒ ์น ์์ผ์ ์ฌ์ฉํ๊ณ ์ ํ ๋ ์ข๋ค.
ws ๋ชจ๋ ๋ถ๋ฌ์จ ํ ์ต์คํ๋ ์ค ์๋ฒ๋ฅผ ์น ์์ผ๊ณผ ์ฐ๊ฒฐํ๋ค. ์ฐ๊ฒฐ ํ์๋ ์น ์์ผ ์๋ฒ(wss)์ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ๋ถ์ธ๋ค. ์น ์์ผ์ ์ด๋ฒคํธ ๊ธฐ๋ฐ์ผ๋ก ์๋ํ๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค. ์ค์๊ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ๋ฐ์ผ๋ฏ๋ก ํญ์ ๋๊ธฐํด์ผ ํ๋ค.
๊ตฌํํ๋ ค๋ ์๋น์ค๊ฐ ์ข ๋ ๋ณต์กํด์ง๋ค๋ฉด Socket.IO๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ํธํ๋ค.
//socket.js
const SocketIO = require('socket.io');
module.exports = (server) => {
const io = SocketIO(server, { path: '/socket.io' });
io.on('connection', (socket) => { // ์น์์ผ ์ฐ๊ฒฐ ์
const req = socket.request;
const ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
console.log('์๋ก์ด ํด๋ผ์ด์ธํธ ์ ์!', ip, socket.id, req.ip);
socket.on('disconnect', () => { // ์ฐ๊ฒฐ ์ข
๋ฃ ์
console.log('ํด๋ผ์ด์ธํธ ์ ์ ํด์ ', ip, socket.id);
clearInterval(socket.interval);
});
socket.on('error', (error) => { // ์๋ฌ ์
console.error(error);
});
socket.on('reply', (data) => { // ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๋ฉ์์ง
console.log(data);
});
socket.interval = setInterval(() => { // 3์ด๋ง๋ค ํด๋ผ์ด์ธํธ๋ก ๋ฉ์์ง ์ ์ก
socket.emit('news', 'Hello Socket.IO');
}, 3000);
});
};
socket ๊ฐ์ฒด์ ์ด๋ฒคํธ ๋ฆฌ์ค๋
ํด๋ผ์ด์ธํธ ๋ถ๋ถ
<!-- veiws/index.html -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>GIF ์ฑํ
๋ฐฉ</title>
</head>
<body>
<div>F12๋ฅผ ๋๋ฌ console ํญ๊ณผ network ํญ์ ํ์ธํ์ธ์.</div>
<script src="/socket.io/socket.io.js"></script>
<script>
const socket = io.connect('http://localhost:8005', {
path: '/socket.io',
transports: ['websocket'],
});
socket.on('news', function (data) {
console.log(data);
socket.emit('reply', 'Hello Node.JS');
});
</script>
</body>
</html>
Socket.IO๋ ๋ฏธ๋ค์จ์ด๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก express-session์ ๊ณต์ ํ๋ฉด ๋๋ค.
socket.js์์ axios ์์ฒญ์ ๋ณด๋ผ ๋๋ ์์ฒญ์๊ฐ ๋๊ตฌ์ธ์ง์ ๋ํ ์ ๋ณด๊ฐ ๋ค์ด์์ง ์๋ค. ๋ธ๋ผ์ฐ์ ์์ axios ์์ฒญ์ ๋ณด๋ผ ๋๋ ์๋์ผ๋ก ์ฟ ํค๋ฅผ ๊ฐ์ด ๋ฃ์ด์ ๋ณด๋ด์ง๋ง, ์๋ฒ์์ axios ์์ฒญ์ ๋ณด๋ผ ๋๋ ์ฟ ํค๊ฐ ๊ฐ์ด ๋ณด๋ด์ง์ง ์๋๋ค. ๋ฐ๋ผ์ express-session์ด ์์ฒญ์๊ฐ ๋๊ตฌ์ธ์ง ํ๋จํ ์ ์์ผ๋ฏ๋ก, ์์ฒญ ํค๋์ ์ธ์ ์ฟ ํค๋ฅผ ์ง์ ๋ฃ์ด์ผ ํ๋ค.
io ๊ฐ์ฒด์ cookie-parser๋ฅผ ์ฐ๊ฒฐํ ํ axios ์์ฒญ์ ๋ณด๋ผ ๋ connet.sid ์ฟ ํค๋ฅผ ์ง์ ์ค์ ํ๋ค.
socket. to (์์ผ ์์ด๋).emit(์ด๋ฒคํธ, ๋ฐ์ดํฐ);
socket.broadcast.emit(์ด๋ฒคํธ, ๋ฐ์ดํฐ);
socket.broadcast. to (๋ฐฉ์์ด๋).emit(์ด๋ฒคํธ, ๋ฐ์ดํฐ);
Node.js
Editor : seol
[Node.js] 15์ฅ AWS์ GCP๋ก ๋ฐฐํฌํ๊ธฐ (0) | 2023.01.05 |
---|---|
[Node.js] 14์ฅ CLI ํ๋ก๊ทธ๋จ ๋ง๋ค๊ธฐ (0) | 2023.01.05 |
[Node.js] 11์ฅ ๋ ธ๋ ์๋น์ค ํ ์คํธํ๊ธฐ (0) | 2022.12.01 |
[Node.js] 10์ฅ ์น API ์๋ฒ ๋ง๋ค๊ธฐ (0) | 2022.11.24 |
[Node.js] 9์ฅ ์ต์คํ๋ ์ค๋ก SNS ์๋น์ค ๋ง๋ค๊ธฐ (0) | 2022.11.17 |