TCP,UDP, net으로 서버만들기

이재영·2023년 4월 29일
0

Node.js

목록 보기
2/12
post-thumbnail

TCP 및 UDP 프로토콜의 이해

  • 프로토콜이란 네트워크에서 데이터를 전송하고 요청 응답 하기위한 규칙을 말한다.

    예를 들어 우리가 인터넷에서 사용되는 http(Hyper Text Transfer protocol)

    이런것들이 프로토콜이다.

TCP와 UDP

  • 우리가 네트워크 통신을 하면서 많이 사용되는 프로토콜에는 TCP와 UDP가 있다.

    두 프로토콜은 OSI 모델의 전송 계층에 해당된다.

  • TCP : 데이터 전송 이전 두 장치 간 안정적인 연결을 지향하는 프로토콜이다.

  • UDP : 데이터 전송 전에 가상 회선을 설정하지 않는 프로토콜

    (예를 들어 영상 스트리밍, 게임 같은 짧은 대기시간과 빠른 속도가 필요한곳에 사용)


TCP 서버를 만들어보자.

내장모듈 net을 사용하면 tcp소켓을 만들어서 사용할 수 있다.
tcp소켓을 생성하고 서버와 클라이언트간의 응답 요청을 맺을수 있다.

const net = require("net");
const PORT = 4000;

//서버 객체를 생성하고
//createServer 메서드로 콜백함수를 전달.
//client가 접속시 콜백함수 실행
const server =net.createServer((client)=>{
	//클라이언트가 접속시 실행
    //클라이언트가 데이터를 보내서 데이터는 받는다면
    //아래처럼
	client.on("data",(data)=>{
    	
        //클라이언트가 보낸 데이터
        // 네트워크를 통해 전송되는 데이터
        // 바이너리(이진법) 형식으로 전송된다. 
        // 즉 ,클라이언트가 보낸 데이터는 Buffer 형태로 전송이 되며
        // * Buffer *  임시로 바이너리 데이터를 저장하기 위한 메모리 공간 혹은 바이너리 데이터 자체
        // 서버는 해석해서 문자열로 변환 해주면 된다.
        // 출력된 데이터는 buffer 형식으로 인코딩 해서 우리가 보낸 데이터처럼 보이는것.
          
    	console.log(toString(data));
    });
    
}); //TCP의 내용을 만들어 준것.

//서버를 대기상태로 만듬
server.listen(PORT,()=>{
	console.log("서버 잘열렸음 PORT는 " +PORT);
});

TCP 서버와 클라이언트를 만들어보자.

먼저 server.js

//net으로 tcp통신 , 포트는 808
const net = require("net");
const PORT = 8080;

//Buffer.from 메서드를 사용해서 문자열을 바이트 데이터로 변환 해준다.
//변환하는 이유는 HTTP 응답은 바이트 데이터로 전송되기 때문
//body 문자열을 그대로 작성해버리면 인코딩에 문제가 생길수가 있다.

const body = Buffer.from("<div><p>Hello nodejs</p></div>");

// Header, body로 구문해서 읽는다.
// response header + body = request message
const response = `HTTP/1.1 200 OK
Connection : keep-alive
Keep-Alive : timeout=4
Content-type : text/html
Content-length : ${body.length}

${body.toString()}
`
// Connection : 클라이언트와 서버의 연결 상태 keep-alive 속성은 클라이언트가 다음 요청을
// 보낼때 까지 연결 유지

//Keep-Alive : 연결을 유지하는 시간을 지정 timeout =4 == 연결을 4초동안 유지하고 연결을 종료

//Content-type : 전송되는 데이터의 타입 text/html == HTML 타입의 데이터 전송

//Content-length : 전송되는 데이터의 길이 데이터의 끝을 알려주는 역할을 한다.

const server  = net.createServer((client)=>{
    // 클라이언트가 접속시 실행
    // 인코딩 설정
    // setEncoding 메서드로 인코딩 방식을 설정할 수 있다.
    // client.setEncoding('utf8');

    //클라이언트가 데이터를 보내서 데이터를 받으면 실행되는 콜백 함수
    client.on("data",(data)=>{
        console.log("client가 보낸"+data) // 데이터의 타입 buffer

        //write 메서드로 클라이언트에 응답을 보냄
        client.write(response);
    })

    //클라이언트와 연결이 종료되면 실행되는 이벤트
    client.on("close",()=>{
        console.log("접속이 종료됨");
    })
})

server.on("connection",()=>{
    console.log("client가 접속했어");
})

server.listen(PORT,()=>{
    console.log("서버 잘 열림 포트는 :" +PORT);
})

client.js

// net 모듈을 가져오고
const net = require("net");

//포트의 내용을 설정해줄 객체를 담아놓고
const config = {port : 8080}

//connect 메서드를 사용해서
//TCP 소켓을 만들고 지정할 포트로 연결을 시도한다.
const socket = net.connect(config)

socket.on("connect",()=>{
    //연결되면 connet 이벤트를 실행.
    console.log("연결이 잘 되었어요");

    socket.write("데이터 전송22");

})

socket.on("data",(data)=>{
    //TCP 소켓에서 데이터를 받으면 콜백 함수 실행
	
  	// 아래구문은 서버에서 보내는 response를 buffer 형태가 아닌 string 형태로 확인 가능.
    // console.log("받은 데이터 : ",(data.toString("utf-8"))); 
    console.log("받은 데이터 : ",(data));
    socket.end();
    //end 메서드
    //TCP 연결을 종료
})

//HTTP 기본적으로 tcp통신을 하고
//tcp 통신은 쌍방향 통신이 가능하다.
//브라우저 -> http://127.0.0.1:8080 ->로 접속하면 body의 내용인 hello nodejs 확인 가능
profile
한걸음씩

0개의 댓글