하나씩 차근차근
article thumbnail
Published 2023. 2. 24. 02:01
chatting server - socket.io 연결 Javascript

이번에는 앞에서 만든 express 서버를 socket.io 라이브러리를 사용해서 웹소켓을 사용해 통신하겠습니다.

 

시작

먼저 socket.io 모듈을 다운받습니다.

PS C:\Users\TEST\Desktop\Javascript_Advanced\chatting_web> npm i socket.io

다음으로 server.js 파일 안에 httpServer 와 socketServer 를 각각 만들어줍니다.

import express from "express";
import http from "http";
import SocketIO from "socket.io";

const app = express();
const httpServer = http.createServer(app);
const socketServer = SocketIO(httpServer);

app.use("/js", express.static(__dirname + "/js"));

app.get("/", (req, res) => res.sendFile(__dirname + "/views/" + "home.html"));
app.get("/*", (req, res) => res.redirect("/"));

const handleListen = () => {
  console.log("Server Start");
};
httpServer.listen(3000, handleListen);

 

프론트 부분

다음으로 home.html 파일을 수정합니다.

<!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>Chatting</title>
  </head>
  <body>
    <header>Chatting Web Page</header>
    <main>
      <h2>Welcome</h2>
      <form>
        <input type="text" placeholder="메세지를 입력해주세요." , required />
        <button type="submit">전송</button>
      </form>
    </main>
  </body>
  <script src="/socket.io/socket.io.js"></script>
  <script type="text/javascript" src="/js/app.js"></script>
</html>

위에서 설치한 socket.io 를 통해 html 파일에서도 socket.io 를 사용할 수 있습니다.

주의할점은 socket.io 태그가 app.js 태그보다 위에 선언되어야 합니다.

다음으로 app.js 파일을 수정합니다.

const socket = io();

 

서버 부분

server 에서 소켓을 통해 클라이언트와 서버가 연결될 경우 작동하도록 코드를 추가하겠습니다.

import express from "express";
import http from "http";
import SocketIO from "socket.io";

const app = express();
const httpServer = http.createServer(app);
const socketServer = SocketIO(httpServer);

app.use("/js", express.static(__dirname + "/js"));

app.get("/", (req, res) => res.sendFile(__dirname + "/views/" + "home.html"));
app.get("/*", (req, res) => res.redirect("/"));

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

const handleListen = () => {
  console.log("Server Start");
};
httpServer.listen(3000, handleListen);

 

결과

브라우저를 통해 재접속하고 visual studio code 의 터미널을 확인하면 다음과 같이

socket 의 내용이 출력되는것을 확인할 수 있습니다.

[nodemon] restarting due to changes...
[nodemon] starting `babel-node src/server.js`
Server Start
<ref *1> Socket {
  _events: [Object: null prototype] {},
  _eventsCount: 0,
  _maxListeners: undefined,
  
  ...
  
    auth: {}
  },
  [Symbol(kCapture)]: false
}

 

메세지 보내기

다음으로 form 에 입력한 값을 서버에서 받을 수 있도록 코드를 수정하겠습니다.

const socket = io();

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

function messageSubmit(event) {
  event.preventDefault();
  const input = form.querySelector("input");
  socket.emit("message", input.value);
  input.value = "";
}

form.addEventListener("submit", messageSubmit);

app.js 파일에 messageSubmit 이라는 매서드를 작성하고 socket 을 통해 "message" 라는 이벤트를 정의해서

input 값에 입력된 값을 보내게 됩니다.

emit 메서드는 사용자가 원하는 이벤트를 발생시키는 명령어
import express from "express";
import http from "http";
import SocketIO from "socket.io";

const app = express();
const httpServer = http.createServer(app);
const socketServer = SocketIO(httpServer);

app.use("/js", express.static(__dirname + "/js"));

app.get("/", (req, res) => res.sendFile(__dirname + "/views/" + "home.html"));
app.get("/*", (req, res) => res.redirect("/"));

socketServer.on("connection", (socket) => {
  // console.log(socket);
  socket.on("message", (message) => console.log(message));
});

const handleListen = () => {
  console.log("Server Start");
};
httpServer.listen(3000, handleListen);

server.js 에서는 socket.on 을 통해 "message" 이벤트가 발생했을 경우, 받은 message 를 출력하게 됩니다.

위와 같이 hello 를 입력하고 전송하면 visual studio code 의 터미널에 다음과 같이 출력이 됩니다.

[nodemon] restarting due to changes...
[nodemon] starting `babel-node src/server.js`
Server Start
hello
profile

하나씩 차근차근

@jeehwan_lee

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!