NodeJs.TCP Server 만들기(1)

2022. 12. 15. 20:47NodeJs

목차
1. Server, Client 파일의 생성
2. Server.js
3. Client.js
4. 코드 해석 및 흐름

1. Server, Client 파일의 생성

 

보통은 Server와 Client를 서로 다른 컴퓨터끼리 통신을 하지만 Server가 잘 구현되었는지 보기 위해 임의로 나누어보자.

 

같은 프로세스(실행되고있는 파일, 프로그램) 안의 서로 다른 스레드라면 불가능하겠지만, 두 가지의 프로세스를 돌려 다른 프로세스의 다른 스레드라면 가능하다.

<그림 1> 서로 다른 프로세스

 

Server.js와 Client.js를 각각 파일로 만들어보자.

 

 


2.  Server.js 

서버 역할을 하는 자바스크립트 파일을 만들어보자.

const net = require('net')

const PORT = process.env.SERVER_PORT || 3000
const HOST = process.env.SERVER_HOST || "127.0.0.1"

const server = net.createServer((client) => {
    client.setEncoding('utf8')

    client.on("data", (data) => {
        console.log(data)
        console.log(data.toString('hex'))
        console.log(data.toString('utf8'))
    })

    client.on("close", () => {
        console.log("Goodbye client.")
    })
})

server.listen(PORT, HOST, () => {
    console.log(`Server Listening Port : ${PORT}`)

    server.on("connection", () => {
        console.log("client가 접속함!")
    })
})

 

 


3.  Client.js 

클라이언트 역할을 하는 자바스크립트 파일을 만들어보자.

const net = require('net')

const config = {port:3000, host:'127.0.0.1'}
const socket = net.connect(config)

socket.on("connect", () => {
    console.log("connected to server!")

    socket.write("Send_Data")
})

 


4. 코드 해석 및 흐름

 

<그림 2> Server.js와 Client.js

우선, 두 파일 모두 위에서 require를 이용해  TCP 통신을 위한 내장모듈 'net'을 가져온다.

(TCP는 커널 영역에 속해있어 우리가 조작하기 힘들다.)

 

Server.js에선 createServer 메서드를 이용해 서버를 만들고 server 변수(함수 선언식)에 담았다. 항상 요청을 받을 수 있도록 구현되어 있는 listen 메서드를 이용해 서버를 시작한다.

 

Client.js에서는 Server의 포트번호(PORT)와, IP주소(HOST)를 이용해 서버로의 접속을 시도한다.

 

Server에서 이 접속을 server.on("connection")으로 확인한다. 이때 접속하면서 Client에서는 "Send_Data"(String)를 같이 보내왔는데, 이를 server에서 매개변수 = client(socket)로 받아 client.on을 사용해 데이터를 받는 이벤트로 받아낸다.

 

데이터 이벤트를 받는 코드의 윗줄에서 받은 데이터의 변환을 위해 setEncoding 메서드로 'UTF8'로 인코딩 해온다.

( 데이터를 통째로 보내는 것이 아니라 텍스트 형태로 쪼개 보낸다. 쪼개진 형태를 chunk라고 하며,  이를 BufferStream형태로 보낸다.)

 

이 과정을 그림으로 한 번 보자면 다음과 같다.

<그림 3> 데이터를 보내기 전 연결과정

데이터를 보내기 전에 3_way_hand_shaking으로 연결이 되고나서, 데이터를 주고받을 수 있는 상태가 되는 것이다.

 

Server는 Client의 요청에 무조건 응답을 주게 만들어야 한다. 잘못 만들게 되면 다음과 같은 형태로 무한 루프를 돌기도 한다.

<그림 4> 서버와 클라이언트 사이의 데이터 무한루프

이렇게 되지 않도록 서버나 클라이언트에서 연결을 종료 시킬 수 있도록 HTTP 프로토콜로 약속한 것이다.

 

다음번에는 클라이언트를 직접 구현하지 않고, 브라우저를 이용해 내가 만든 서버에 요청을 보내 응답을 줄 때, HTTP 메시지를 어떤 형태로 보내 어떻게 바꿔야 하는지 한번 구현해보도록 하자.

'NodeJs' 카테고리의 다른 글

NodeJs.노드 패키지 매니저(npm)  (0) 2022.12.20
NodeJs.TCP Server 만들기(2)  (0) 2022.12.17
NodeJs.TCP 흐름  (0) 2022.12.15
NodeJs.모듈  (0) 2022.12.06
NodeJs.실행 및 사용방법  (0) 2022.12.06