실시간/Socket IO

5. 알림

sdafdq 2023. 10. 31. 18:05

떠나는 걸 알림

 

SocketIO에는 당연히 우리가 명명한 이벤트 말고도, 다양한 이벤트가 있다.

 

그 중 하나가 disconnecting

이거는 disconnect와 다르다.

말 그대로 연결을 끊는 '중'이다.

 

그러니까 왜, 완전히 끊어버리면 뭔갈 못하니까,

완전히 끊기 전에 하고 싶은 거 날리는 그런 거다.

 

io.on("connection", socket =>{
  socket.on("disconnecting", ()=>{
    socket.rooms.forEach(room => socket.to(room).emit("bye"));
  })
})

추가로 등록해 줬다.

socket이 연결을 끊고 있을 때,

그 소켓이 가입했던 모든 방에다가 "bye"라는 이벤트를 날린다.

 

그러면, 

socket.on("bye",()=>{
  addChatToUl("Someone leave.");
})

그냥 간단히 그 이벤트 받으면,

function addChatToUl(msg){
  const $li = document.createElement("li");
  $li.textContent = msg;
  $roomUl.append($li);
}

떠났다고 메시지 추가하게끔 했다.

 

 

 

 

이제 본격적으로 메시지 주고 받는 걸 추가해 보자.

const enterRoom = (roomName)=>{
  $welcome.style.display = 'none';
  $room.style.display = 'block';
  const $roomTitle = $room.querySelector("h3");
  $roomTitle.textContent = `Room ${roomName}`;

  addChatToUl(`${roomName}에 입장하셨습니다.`);
  $roomForm.addEventListener("submit", (e)=>{
    e.preventDefault();

    const $input = $roomForm.querySelector("input");
    socket.emit("new_message", $input.value, roomName);
    addChatToUl(`You: ${$input.value}`);
    $input.value = "";
  })
}

방 입장 시 추가적으로 이벤트를 추가시키도록 했다.

서버에 new_message라는 이벤트를 보내는 것 이다.

거기에 내가 input에 친 값과, roomName을 같이 보낸다.

roomName을 보내는 이유는 저번 room에 대해 이야기 할 때, 한 소켓은 여러 room을 가질 수 있으며, 또 id와 이름이 똑같은 private room도 가질 수 있다. 그래서 어떤 방인지 특정해 주기 위해 방이름도 같이 보냈다.

전송하면 서버쪽에서 소켓에서 이벤트를 보낼 때 나한테는 빼고 보내니까 그냥 바로 addChat 해서 문서에 추가했다.

그리고 input을 비워줬다.

 

io.on("connection", socket =>{
  socket.on("new_message",(msg, roomName)=>{
    socket.to(roomName).emit("new_message",msg);
  })
})

서버쪽도 간단하다. 그냥 new_message 이벤트를 추가시켜줬다.

콜백 인자로는 우리가 보낸 msg와 방이름을 받는다.

 

그걸 그대로 방이름에 입장해있는 소켓들에게 

new_message라는 이벤트를 메시지와 함께 보낸다.

 

이제 클라이언트쪽에서 new_message 보내는 것만 말고 받는 것도 만들어 보면,

socket.on("new_message",(msg)=>{
  addChatToUl(`Anno : ${msg}`);
})

그냥 이렇게 추가시켜 줬다.

 

 

 

 

const socket = io();

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

const $room = document.getElementById("room");
const $roomForm = $room.querySelector("form");
const $roomUl = $room.querySelector("ul");

$room.style.display = 'none';

const enterRoom = (roomName)=>{
  $welcome.style.display = 'none';
  $room.style.display = 'block';
  const $roomTitle = $room.querySelector("h3");
  $roomTitle.textContent = `Room ${roomName}`;

  addChatToUl(`${roomName}에 입장하셨습니다.`);
  $roomForm.addEventListener("submit", (e)=>{
    e.preventDefault();

    const $input = $roomForm.querySelector("input");
    socket.emit("new_message", $input.value, roomName);
    addChatToUl(`You: ${$input.value}`);
    $input.value = "";
  })
}

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


socket.on("welcome", ()=>{
  addChatToUl("Someone joined!");
});

socket.on("bye",()=>{
  addChatToUl("Someone leave.");
})

socket.on("new_message",(msg)=>{
  addChatToUl(`Anno : ${msg}`);
})


function addChatToUl(msg){
  const $li = document.createElement("li");
  $li.textContent = msg;
  $roomUl.append($li);
}

 

 

 

 

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.onAny(e=>{
    console.log(`socket on : ${e}`);
  });
  socket.on("enter_room", (roomName, callback)=>{
    socket.join(roomName.payload);
    callback(roomName.payload);
    socket.to(roomName.payload).emit("welcome");
  })

  socket.on("disconnecting", ()=>{
    socket.rooms.forEach(room => socket.to(room).emit("bye"));
  })

  socket.on("new_message",(msg, roomName)=>{
    socket.to(roomName).emit("new_message",msg);
  })
})

server.listen(3000, handleListen);


function msgToObject(m){
  const data = m.toString('utf-8');
  const msgObj = JSON.parse(data);
  return msgObj;
}

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

6. 닉네임  (0) 2023.11.01
4. 방 만들기  (0) 2023.10.31
3. SocketIO 기능  (0) 2023.10.30
2. Socket IO 설치  (0) 2023.10.27
1. Socket IO  (0) 2023.10.27