net 모듈을 이용하여 TCP 프로토콜로 서버-클라이언트 간 데이터를 전송하는 코드이다.
서버 |
socket-server.js
const net = require("net"); let pool = []; const server = net.createServer((socket) => { pool.push(socket); socket.on("data", (data) => { let d = JSON.parse(data); switch (d.type) { case "CONNECT": for (let s of pool) s.write(d.content + " connected!"); break; case "CHAT": for (let s of pool) s.write(d.content); break; } }); socket.on("error", (e) => { const exitSocket = pool.findIndex((item) => item === socket); if (exitSocket > -1) pool.splice(exitSocket, 1); for (let s of pool) s.write("Someone's out."); }); }); server.listen(5000, () => { console.log("listening 5000"); });
1. 연결 관리하기
하나의 서버에 클라이언트 여러 개가 연결되므로, 이를 pool 배열을 이용하여 관리해 준다.
연결이 들어올 때마다 pool.push(socket)으로 연결을 pool 배열에 넣어주고, 아래 2. 클라이언트에 채팅 보내기와 같은 프로세스로 모든 클라이언트에 새 연결이 들어왔음을 알려준다.
또 연결이 끊길 때는 에러를 캐치해서, pool 배열 내에서 현재 연결을 찾아준 후 pool.splice()로 배열에서 뺀다. (에러를 캐치하지 않으면 클라이언트 하나가 끊기면 서버도 에러를 내면서 같이 끊긴다.)
2. 클라이언트에 채팅 보내기
모든 연결에 전부 채팅을 보내야 하므로, for (let s of pool)로 pool의 모든 원소들에 write를 해준다.
클라이언트 |
socket-client.js
const net = require("net"); const readline = require("readline"); const rl = readline.createInterface({ input: process.stdin, output: process.stdout, }); const client = net.connect({ port: 5000, host: "localhost" }); client.on("connect", () => { rl.question("Name : ", (name) => { client.write( JSON.stringify({ type: "CONNECT", content: `${name}`, }) ); rl.on("line", function (line) { client.write( JSON.stringify({ type: "CHAT", content: `${name} : ${line}`, }) ); }); }); }); client.on("data", (data) => { console.log(data.toString()); }); client.on("close", () => { console.log("ended"); });
1. 이름 입력
이름 입력 후 메세지를 입력하는 게 자연스러우므로, question의 콜백에 line을 입력받게 했다.
2. 서버에 채팅 보내기
클라이언트에서 보내는 데이터는 두 종류이고, 형식은 JSON이다.
서버에서 데이터를 받은 후 어떤 데이터인지 알 수 있도록 type 변수를 넣었다.
CONNECT / 연결이 되었음을 알리고, 입력받은 이름을 서버에 전달한다.
CHAT / 입력받은 line을 name과 함께 서버에 전달한다.

실행 화면은 이렇다. 각각 서버 / 클라이언트1 / 클라이언트2.
이름을 입력받고 채팅을 주고받은 후 클라이언트2가 접속을 종료한 상황이다.
'Web > Backend' 카테고리의 다른 글
[GCP] 구글 클라우드 플랫폼에 Nginx로 리액트 프로젝트 배포하기 (2) | 2020.11.29 |
---|---|
[JWT] JSON Web Token (0) | 2020.08.19 |
[GCP] 구글 클라우드 DNS에 도메인 연결하기 (2) | 2020.07.20 |
[GCS] 구글 클라우드 스토리지(GCS)로 파일 업로드 후 접근 URL 생성하기 (3) | 2020.06.01 |
[GCS] [번역] 브라우저에서 구글 클라우드 스토리지(GCS)로 파일 업로드하기 (0) | 2020.06.01 |
댓글