실시간/Socket IO

3. SocketIO 기능

sdafdq 2023. 10. 30. 17:18

대충 클라이언트의 문서에

form
      input(placeholder="room name", required, type="text")
      button Enter Room

이렇게,

 

스크립트에

const socket = io();

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


$form.addEventListener("submit", (e)=>{
  e.preventDefault();
  const $input =  $form.querySelector("input");
  socket.emit("enter_room", {payload : $input.value});
  $input.value = "";
});

이렇게 해 줬는데,

 

보면 저 form을 찾아오고,

form을 submit했을 때 이벤트를 추가 시켰다.

input:text에 있는 내용을 socket을 통해 전송한다.

근데, 이번에는 message 이벤트가 아니다.

 

이제 이벤트를 우리 마음대로 정의할 수 있다.

그냥 socket.emit("이벤트", 객체)

하고,

io.on("connection", socket =>{
  socket.on("enter_room", (msg)=>{
    console.log(msg);
  })
})

서버에서 이렇게 똑같은 이벤트로 받으면 된다.

실제로 잘 동작한다. 정말 간결해 졌다.

이제 그냥 서버랑 클라이언트 둘다 이름만 맞춰서 딱딱 동작을 정의하면 된다.

 

아 그리고,

이게 좋은점이 이제 우리가 막 문자열로 변환하고 그런 거 안해도 된다.

그냥 알아서 전송할 때 문자열로 변환해서 보내고, 

받았을 때는 알아서 객체로 변환시킨다.

 

그리고 또 놀라운 점이 하나 있는데,

  socket.emit("enter_room", {payload : $input.value}, ()=>{
    console.log("good man");
  });

이렇게 인자 맨 마지막에 콜백을 보낼 수 있다.

 

그리고 이 콜백을 서버에 보낸다고 서버에서 실행하는 게 아니라,

 

socket.on("enter_room", (msg, callback)=>{
    console.log(msg);
    callback();
})

이렇게 서버에서 저 콜백을 호출하면,

 

클라이언트 쪽에서 실행이 된다.

 

그러니까, 

클라이언트가 서버에 콜백함수를 주면, 서버는 클라이언트에게 그 콜백함수를 실행하라고 신호를 줄 수 있다.

그러면 이제 또 서버쪽에서 데이터를 가공해서 저 콜백에 인자로 넣어준다면..

 

그러니까, 클라이언트가 서버에 데이터를 전송하고, 서버가 응답받은 후 클라이언트가 해야 할 동작을 저 콜백을 넘김으로써 서버가 클라이언트쪽의 함수를 작동할 타이밍을 신호를 줌으로써 되게 깔끔해 진다.

 

 

app.js

const socket = io();

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


$form.addEventListener("submit", (e)=>{
  e.preventDefault();
  const $input =  $form.querySelector("input");
  socket.emit("enter_room", {payload : $input.value}, (cm)=>{
    console.log(cm);
  });
  $input.value = "";
});

이렇게 콜백으로 뭔가 넣어주는 값을 클라이언트 쪽에서 실행토록 하고

 

server.js

import express, { json } from "express";
import http from "http";
import SocketIO from 'socket.io'

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

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

const server = http.createServer(app);
const io = SocketIO(server);

io.on("connection", socket =>{
  socket.on("enter_room", (msg, callback)=>{
    console.log(msg);
    callback("하이요");
  })
})

server.listen(3000, handleListen);

이렇게 하면 실제로 클라이언트 쪽에 하이요 라고 찍힘.

 

 

 

인자도 오브젝트 뿐만 아니라 여러 종류, 여러 개를 보낼 수 있음.

순서만 잘 맞춰서 받으면 됨.

단, 콜백함수는 무조건 마지막이여야 함.

 

 

 

그리고 서버쪽이 다운되면, 클라이언트 쪽에서 기본값이 5초였나? 5초마다 재연결 시도함.

 

 

그리고 콜백함수 보내는게 서버쪽에서 실행되지 않아야 한다.

안 그럼 보안문제가..

 

 

 

socket.on이 메시지 받는거고,

socket.emit이 메시지 전송

'실시간 > Socket IO' 카테고리의 다른 글

6. 닉네임  (0) 2023.11.01
5. 알림  (0) 2023.10.31
4. 방 만들기  (0) 2023.10.31
2. Socket IO 설치  (0) 2023.10.27
1. Socket IO  (0) 2023.10.27