자바 - HTTP 서버 개발
V1
<h1>Hello World</h1>import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import static java.nio.charset.StandardCharsets.UTF_8;
import static util.MyLogger.log;
/**
* HTTP 서버 개발
* @version 1
*/
public class HttpServerV1 {
private final int port;
public HttpServerV1(int port) {
this.port = port;
}
public void start() throws IOException {
ServerSocket serverSocket = new ServerSocket(port);
log("서버 시작 port: " + port);
while (true) {
Socket socket = serverSocket.accept();
process(socket);
}
}
private void process(Socket socket) throws IOException {
try (socket;
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), UTF_8));
PrintWriter writer = new PrintWriter(socket.getOutputStream(), false, UTF_8)) { //autoFlush=false
//HTTP 요청을 String으로 반환
String requestString = requestToString(reader);
if (requestString.contains("/favicon.ico")) {
log("favicon 요청");
return;
}
log("HTTP 요청 정보 출력");
System.out.println(requestString);
log("HTTP 응답 생성중...");
sleep(5000); //서버 처리 시간 가정
responseToClient(writer);
log("HTTP 응답 전달 완료");
}
}
private String requestToString(BufferedReader reader) throws IOException {
StringBuilder sb = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
//줄바꿈, HTTP 헤더의 마지막으로 인식
//빈 라인 이후에는 메시지 바디가 나온다.
if (line.isEmpty()) break;
sb.append(line)
.append("\n");
}
return sb.toString();
}
private void responseToClient(PrintWriter writer) {
//웹 브라우저에 전달하는 내용
String body = "<h1>Hello World</h1>";
int length = body.getBytes(UTF_8).length;
StringBuilder sb = new StringBuilder();
// \r\n = 줄바꿈 처리
sb.append("HTTP/1.1 200 OK\r\n")
.append("Content-Type: text/html\r\n")
.append("Content-Length: ").append(length).append("\r\n")
.append("\r\n") //header, body 구분 라인
.append(body);
log("HTTP 응답 정보 출력");
System.out.println(sb);
writer.println(sb);
writer.flush();
}
private void sleep(int millis) {
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}V2

V3




퍼센트(%) 인코딩

V4
V5

Last updated