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