실시간, 양방향, evnet기반의 통신을 가능하게 하는
framework
탄력성
이 뛰어남.socket.send
=> socket.emit
socket.on("message")
=> socket.on("reply")
websocket으로 작성한 코드를 모두 지워주고 socketIO를 이용해 다시 코드를 짤 것이다!
npm i socket.io
server.js에서 필요없는 부분 삭제해줌! app.js도 전부 삭제해주고, home.pug도 다시 작성!
/src/server.js
import SocketIO from "socket.io";
// 서버 생성(http)
const httpServer = http.createServer(app);
const wsServer = SocketIO(httpServer);
// 서버 연결
wsServer.on("connection", (socket) => {
console.log(socket);
});
httpServer.listen(3000, handleListen);
/src/views/home.pug
// socket.io front(클라이언트)에 설치
script(src="/socket.io/socket.io.js")
/src/public/js/app.js
io는 자동적으로 backend의 socket.io와 연결해주는 funciton
const socket = io();
이렇게 작성해주면 console.log(socket)이 작동해서 터미널에 잘 가져온다.
websocket으로 코드를 작성했을때 sockets.push(socket)
을 사용해서 일일히 socket사용자를 넣어주었는데 이제는 socket.io가 알아서 socket_id를 생성해서 보여줌!!
유저가 웹사이트로 들어가게 되면 방을 만들거나, 방에 참가할 수 있게 됨.
이걸 socketIO로 구현할 예정!이미 socketIO에는 room기능이 있기때문에 그걸 사용할 것
- 방에 메시지도 보낼 수 있는 기능도 있어서 그것도 사용해 볼 예정!
/src/views/home.pug
body
header
h1 Noom
main
div#welcome
form
input(placeholder="room name", required, type="text")
button Enter Room
script(src="/socket.io/socket.io.js")
script(src="/public/js/app.js")
/src/public/js/app.js
여기서 서버에서 호출하는 function을 만들어 줄 수 있다!
// io는 자동적으로 backend의 socket.io와 연결해주는 funciton
const socket = io();
const welcome = document.getElementById("welcome");
const form = welcome.querySelector("form");
function handleRoomSubmit(event) {
event.preventDefault();
const input = form.querySelector("input");
//socket.send와 같은 역할
//전에는 object로 못보내서 string으로 변환하여 보냈는데, socketIO는 가능
//event,보내고 싶은 데이터(여러개 가능, 타입 상관없음), 서버에서 호출하는 function
socket.emit("enter_room", { payload: input.value }, () => {
console.log("server is done!");
});
input.value = "";
}
form.addEventListener("submit", handleRoomSubmit);
/src/server.js
이벤트"enter_room"은 app.js와 동일해야함!
그래야 서버에서 사용할 함수를 클라이언트에서 받아 올 수 있음
// 서버 연결
wsServer.on("connection", (socket) => {
//socket.on("message")사용안함. 우리가 원하는 이벤트로 사용가능
socket.on("enter_room", (msg, done) => {
console.log(msg);
//done함수는 프론트(app.js)에서 보내주는것! wow!
setTimeout(() => {
done();
}, 10000);
});
});
- socket.emit에서 보내고 싶은 데이터를 쓸 때 여러개 가능, 타입 상관없음!!
/src/public/js/app.js
/src/server.js
=> 결과
- socket.emit의 마지막 argument에 실행될 function을 넣어줘야 함!
- 여기서 주의 backend는 frontend에서 오는 코드를 실행시키면 안됨. => 보안문제가 있음!
/src/public/js/app.js
/src/server.js
console은 터미널에서 실행되지만,
setTimeout으로 받아온 함수를 실행하는건 백이 아니라 프론트에서 실행됨!
(실행을 시키는건 백이지만 실제로 실행되는건 프론트!)
신뢰할 수 없는 코드가 작성이 될 수 있기 때문에 백에서 실행되면 안됨!
추가) 백엔드에서 보내준 메시지를 가져와서 프론트에서 콘솔찍어주기
/src/server.js
/src/public/js/app.js
=>