๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

javascript/์คŒ ํด๋ก ์ฝ”๋”ฉ

DAY 3 #2.0 ~ #2.3

 

#2.0 SocketIO vs WebSockets

https://socket.io/ 

SocketIO : ์‹ค์‹œ๊ฐ„, ์–‘๋ฐฉํ–ฅ, event ๊ธฐ๋ฐ˜์˜ ํ†ต์‹ ์„ ๊ฐ€๋Šฅ์ผ€ ํ•˜๋Š” framework

 

https://socket.io/docs/v4/ 

WebSocket๊ณผ์˜ ์ฐจ์ด์ ์€, webSocket์ด socketIO๊ฐ€ ์œ„์˜ ํ†ต์‹ ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์— ๋ถˆ๊ณผํ•˜๋ฉฐ, ๋งŒ์•ฝ WebSocket์ด ์‚ฌ์šฉ๋ชปํ•˜๊ฒŒ ๋˜๋”๋ผ๋„ socketIO๋Š” http long-polling ๋“ฑ์„ ๋Œ€์ฒดํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋ฌธ์„œ์— ๋‚˜์™€์žˆ๋‹ค. ๋‹น์žฅ webSocket์€ protocol, socketIO๋Š” framework์ด๋ผ๋Š” ์ ์—์„œ ๋‹ค๋ฅด๋‹ค.. 

 

https://www.npmjs.com/package/socket.io 

 

 

#2.1 Installing SocketIO

 

SocketIO ์„ค์น˜

npm i socket.io

 

๊ธฐ์กด webSocket ๋ฐฉ์‹ : ๋จผ์ € http ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค๊ณ , ์ƒˆ๋กœ์šด webSocket ์„œ๋ฒ„ ๋งŒ๋“ค ๋•Œ HTTP๋ฅผ ์œ„์— ์Œ“์•„ ์˜ฌ๋ฆฌ๋ฉฐ ๋งŒ๋“ค์—ˆ์Œ 

= socketIO๋„ ๋งˆ์ฐฌ๊ฐ€์ง€.

 

server.js

import { Server } from "socket.io";

// --- ์ƒ๋žต

const httpServer = http.createServer(app);
const wsServer = new Server(httpServer);

wsServer.on("connection", (socket)=>{
  console.log(socket);
});

const handleListen = () => console.log(`Listening on http://localhost:3000`);
httpServer.listen(3000, handleListen);

 

 

์ฐธ๊ณ ๋กœ ์ง€๊ธˆ๊นŒ์ง€ ํ–ˆ๋˜ ๋‚ด์šฉ๋“ค์€ ์ด์ œ socket.io๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— websocket ๊ธฐ๋ฐ˜์˜ ์ฝ”๋“œ๋“ค์€ ์‹น ์ดˆ๊ธฐํ™”๋œ๋‹ค... 

๊ฐ•์˜์—์„œ๋Š” user๊ฐ€ chat์— ์ฐธ๊ฐ€ํ•˜๊ณ  ์‹ถ์„ ๋•Œ, room์„ ๋จผ์ € ๋งŒ๋“ค๋„๋ก ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๊ฒƒ์ด๋ผ home.pug ํŒŒ์ผ๋„ ์ˆ˜์ •๋œ๋‹ค.

 

 

#2.2 SocketIO is Amazing

 

๋จผ์ € ๋ฐฉ์„ ๋งŒ๋“œ๋Š” ์›นํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค.

 

home.pug

doctype html
html(lang="en")
    head
        meta(charset="UTF-8")
        meta(http-equiv="X-UA-Compatible", content="IE=edge")
        meta(name="viewport", content="width=device-width, initial-scale=1.0")
        title Noom
        //- mvp.css ์‚ฌ์šฉ
        link(rel="stylesheet", href="https://unpkg.com/mvp.css") 
    body 
        header 
            h1 Noom 
        main 
            div#welcome
                form
                    input(placeholder="room name", required, type="text")
                    button Enter Room
        //- front-end์—๋„ socket.io ์„ค์น˜
        script(src="/socket.io/socket.io.js")
        script(src="/public/js/app.js")

 

app.js์—์„œ๋Š” io() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜๋Š”๋ฐ, ์ด๋Š” ๊ธฐ์กด์˜ ๋ณต์žกํ•œ ์ž‘์—…๋“ค์„ ํ•œ๋ฒˆ์— ํ•ด๊ฒฐํ•ด์ฃผ๋ฉฐ, ์ž๋™์ ์œผ๋กœ client์™€ back-end socket.io๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ํ•จ์ˆ˜๋‹ค.

webSocket์—์„œ๋Š” send()๋ฅผ ์ผ๋Š”๋ฐ, ์ด๋ฒˆ์—๋Š” emit()์„ ์‚ฌ์šฉํ•œ๋‹ค. emit์€ ์–ด๋–ค ์ด๋ฒคํŠธ๋ช…๋„ ๋งจ ์•ž ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ ์–ด์ฃผ๋ฉด ๋˜๊ณ , string์ด ์•„๋‹Œ ๋‹ค๋ฅธ ์š”์†Œ(object)๋“ค๋„ ์ „์†ก์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ ๋ฐฑ์—”๋“œ์—์„œ๋„ ํ•จ์ˆ˜ ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ ์ด ์žˆ๋‹ค. ์‹ค์ œ๋กœ ์•„๋ž˜ ์ฝ”๋“œ์—์„œ๋„ 'enter_room'์ด๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์ด๋ฒคํŠธ๋ฅผ back-end์—์„œ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. 

 

 

server.js

import http from "http";
import { Server } from "socket.io";
import express from "express";

const app = express();

app.set("view engine", "pug");
app.set("views", __dirname + "/views");
app.use("/public", express.static(__dirname + "/public"));
app.get("/", (_, res) => res.render("home"));
app.get("/*", (_, res) => res.redirect("/"));

// back-end์— socket.io์„ค์น˜
const httpServer = http.createServer(app);
const wsServer = new Server(httpServer);

wsServer.on("connection", (socket) => {
  socket.on("enter_room", (msg, done) => {
    console.log(msg);
    setTimeout(()=>{
      done("from the backend");
    }, 10000);
  });
});

const handleListen = () => console.log(`Listening on http://localhost:3000`);
httpServer.listen(3000, handleListen);

 

app.js

const socket = io();

const welcome = document.getElementById("welcome");
const form = welcome.querySelector("form");

function handleRoomSubmit(event) {
  event.preventDefault();
  const input = form.querySelector("input");
  socket.emit("enter_room", { payload: input.value }, () =>{
    console.log("server is done.");
  });
  input.value = "";
}

form.addEventListener("submit", handleRoomSubmit);

 

 

๋‚ด๊ฐ€ ๋นก๋Œ€๊ฐ€๋ฆฌ๋ผ์„œ ์ •๋ฆฌํ•˜๋Š”๋ฐ https://ssocoit.tistory.com/192 ์˜ ๋„์›€์„ ์ •๋ง์ •๋ง๋งŽ์ด๋ฐ›์•˜๋‹ค....๊ฑฐ์˜๋ณต๋ถ™์ˆ˜์ค€์ด๋ผํ• ์ •๋„๋กœ,,, 

 

 

'javascript > ์คŒ ํด๋ก ์ฝ”๋”ฉ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

DAY 2 #1.3 ~ 1.9  (0) 2023.02.22
DAY 1 #0.2 ~ #1.2  (0) 2023.02.21