우리가 네트워크 통신을 하면서 많이 사용되는 프로토콜에는 TCP와 UDP가 있다.
두 프로토콜은 OSI 모델의 전송 계층에 해당된다.
TCP : 데이터 전송 이전 두 장치 간 안정적인 연결을 지향하는 프로토콜이다.
UDP : 데이터 전송 전에 가상 회선을 설정하지 않는 프로토콜
(예를 들어 영상 스트리밍, 게임 같은 짧은 대기시간과 빠른 속도가 필요한곳에 사용)
내장모듈 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);
});
//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);
})
// 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 확인 가능