실시간/WebSocket을 이용한 채팅

2. 웹소켓 서버 구현

sdafdq 2023. 10. 18. 18:14

node.js에는 ws라는 라이브러리 지원됨.

 

일단 그럼 npm i ws 해서 설치

 

근데, 우리가 기존에 서버를 express로 쓰고 있었는데, 

express는 http지 웹소켓이 아님.

 

그래서 express에 ws를 사용할 수 있도록 추가해 줄거임.

 

 

약간 바뀌었다.

import express from "express";
import http from "http";
import WebSocket, { WebSocketServer } from 'ws';

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`);
// app.listen(3000);

const server = http.createServer(app);
const wss = new WebSocketServer({server});
server.listen(3000, handleListen);


바뀐 부분

import WebSocket, { WebSocketServer } from 'ws';

import http from "http";

 

// app.listen(3000);

const server = http.createServer(app);
const wss = new WebSocketServer({server});
server.listen(3000, handleListen);

먼저, ws를 import 해 주었다.

혹시 안되면 

https://www.npmjs.com/package/ws

 

ws

Simple to use, blazing fast and thoroughly tested websocket client and server for Node.js. Latest version: 8.14.2, last published: a month ago. Start using ws in your project by running `npm i ws`. There are 16396 other projects in the npm registry using w

www.npmjs.com

공식 문서를 참조해라.

 

여튼, server를 express꺼가 아니라 http껄로 기존에 만들어 놨던 app으로 서버를 만들었다.

 

이게, http로 서버를 만든 이유가 express는 ws를 지원하지 않는다.

그래서 http를 import해서 그걸로 서버를 만들었다.

 

http 서버를 만들 때는 request받을 url이 필요하다.

http:localhost:3000 등

근데 위 코드 보면 자동으로 http://localhost 자동으로 붙는데, 이거 포트번호 지정해줘서 그럼.

포트번호니까 당연히 내 로컬로 서버 띄우는 거고,

그리고 server.listen() 하는 거 자체가 내 로컬에서 서버 띄우는 거니 당연히 http://localhost 

 

그러니까 저걸로 시작하는 경우 기본 호스트가 http://localhost임.

 

server.listen(3000, '192.168.1.100', handleListen);

이렇게 기본 호스트 바꿀 수 있다고 함.

 

 

const wss = new WebSocketServer({server});

웹소켓 생성자로 저렇게 http서버를 감싸는 게 http와 socket을 합치는 공식적인 방법이라고 한다.

저 상태에서 저 server를 띄워도 socket이랑 http 함께 사용할 수 있나보다.

 

wss 해서 변수로 남겨두기는 했는데, wss 안쓸거면 server로 띄우는 거라 꼭 저렇게 변수로 남길 필요는 없다고 한다.

근데 뭐 나중에 쓸 듯. 소켓에 대해 뭐 설정하고 해야 하니.