코드를 실행하면 WebServer.java에서 main문이 실행된다.
포트는 디폴트로 8080으로 int값이 설정되었다.
포트 번호를 서버 소켓에 넣어서 소켓을 연결한다.
그리고 new Thread를 생성해서 RequestHandler를 실행하고 시작한다
여기서 RequestHandler는 클라이언트로부터의 HTTP요청을 처리한다
여기서 RequestHandler는
public RequestHandler(Socket connectionSocket) {
this.connection = connectionSocket;
}
소켓을 생성자로 받고있다.
근데 궁금한 점은 run() 메소드는 아무곳에서도 호출하지 않았는데 어떻게 돌아갈까?
위로 올라가보니
RequestHandler는 Runnable 인터페이스를 구현하고 있다.
Thread 클래스의 생성자에서 객체를 생성할 때 Thread 클래스 내부에서는 Runnable 객체의 run() 메소드를 호출한다.
Thread와 Runnable은 좀 생소한 개념인 것 같다
Thread와 Runnable에 대한 이해 및 사용법
oracle 공식문서
RequestHandler 클래스의 run()은
HTTP 요청이 들어오면 요청을 처리하고 응답을 클라이언트에게 전송한다.
logger.debug("New Client Connect! Connected IP : {}, Port : {}", connection.getInetAddress(),
connection.getPort());
이 부분에서 로그를 출력하고 클라이언트와 연결된 소켓에서 InputStream과 OutputStream을 생성하여 요청 데이터를 읽고 응답 데이터를 전송한다
DataOutputStream은 응답 메세지를 전송하기 위해 사용된다.
byte[] body = Files.readAllBytes(new File(PATH + url).toPath());
이 부분을 이용해서 URL에 해당하는 파일의 내용을 바이트 배열로 읽는다
PATH는 상수로 파일 경로를 지정해주었다
response200Header(dos, body.length);
이 메소드는 HTTP 응답 메시지의 헤더를 작성하는 역할을 하는데, 이 헤더에는 HTTP의 상태 코드, 컨텐츠 타입, 컨텐츠 길이 등의 정보가 포함된다.
responseBody(dos, body);
이 메소드는 HTTP 응답 메세지의 바디를 작성하는 역할이다.
이렇게 HTTP 응답헤더와 바디를 생성하여 클라이언트에게 전송하게된다.