Http프로토콜을 이용한 서버 구축은 나중에 SERVLET( JSP)을 통해서 구현 된다.
package com.java.socket02;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
public class HttpServer01 {
public static void main(String[] args) throws IOException {
// 서버 -클라이언트 간의 통신
// 소켓 구동을 해야 네트워크 통신이 된다.
// 1.서버 소켓 구동(클라이언트의 요청을 기다리는 역할 수행)
ServerSocket server = new ServerSocket(80);
System.out.println("Http Server 구동");
try {
while (true) {
// 2.클라이언트 요청 대기하다가 요청이오면 해당 클라이언트에 대한 소켓을 생성
Socket socket = server.accept();
try {
// 3.클라이언트의 요청 정보를 수신작업
// 입력스트림 생성
// 보조 입출력 스트림(주입출력스트림) 생성
BufferedReader readRequest = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String request = "";
while (true) {
String readLine = readRequest.readLine();
if (readLine == null || readLine.equals("")) {
break;
}
System.out.println(readLine);
if (readLine.startsWith("GET")) {
request = readLine;
}
}
// 4.클라이언트의 요청 정보를 송신작업
// 출력스트림 생성
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
// 출력 내용 html 문서
String msg = "<html><body>";
msg += "<span style='font-size:30pt; color:red; font-weight:bold;'>";
msg += "HTTP 서비스";
msg += "</span>";
msg += "<br><br><span style='font-weight:bold; font-size:15pt'>";
Date date = new Date(System.currentTimeMillis());
msg += date.toString();
msg += "<br><br>요청내용 = " + request;
msg += "</span>";
msg += "</body></html>";
// 네트워크 통신을 위해서 인코딩 작업 거친다.(네트워크 통신 :1바이트씩)
byte[] body = msg.getBytes("UTF-8");
dos.writeBytes("HTTP/1.1 200 OK \\r\\n");
dos.writeBytes("Server:MyServerName\\r\\n");
dos.writeBytes("Cache-Control:private\\r\\n");
dos.writeBytes("Content-Length: " + body.length + "\\r\\n");
dos.writeBytes("Content-Type: text/html;charset=utf-8\\r\\n");
dos.writeBytes("\\r\\n");
dos.write(body, 0, body.length);
dos.writeBytes("\\r\\n");
dos.flush();
// 5.종료
} finally {
socket.close();
}
}
} finally {
server.close();
}
}
}

Http Server 구동
GET / HTTP/1.1
Host: localhost:8081
Connection: keep-alive
sec-ch-ua: " Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"
sec-ch-ua-mobile: ?0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
Cookie: Idea-33c1f78e=8337961c-b13c-4c1e-b6f4-b60a5cb838d1; JSESSIONID=19429A350EEF33197CB0A1179169BC47
GET /favicon.ico HTTP/1.1
Host: localhost:8081
Connection: keep-alive
sec-ch-ua: " Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"
sec-ch-ua-mobile: ?0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: no-cors
Sec-Fetch-Dest: image
Referer: <http://localhost:8081/>
Accept-Encoding: gzip, deflate, br
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
Cookie: Idea-33c1f78e=8337961c-b13c-4c1e-b6f4-b60a5cb838d1; JSESSIONID=19429A350EEF33197CB0A1179169BC47