본문 바로가기
Java

[Java] HTTP 웹 서버 구현 / index.html 요청에 대한 응답

by bkuk 2023. 3. 17.

index.html로 응답

클라이언트가 http://localhost:8080/index.html로 접속했을 때 서버는 webapp 디렉토리의 index.html 파일을 읽어 클라이언트에 응답한다.

 

HTTP Header

GET /index.html HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Accept: */*

 

  • BufferedReader.readLine() 메서드를 활용해 라인별로 HTTP 요청 정보를 읽는다.
    • HTTP 요청 정보 전체를 출력한다.
    • 헤더 마지막은 br.readLine().equals("") 로 확인한다.

 

  • HTTP 요청 정보의 첫 번째 라인에서 요청URI를 출력한다.
    • String[] tokens = line.split(" ");과 같이 split(" ")메서드를 활용해 문자열을 분리한다.

 

  • 요청 URI에 해당하는 파일을 webapp 디렉토리에서 읽어 전달한다.
    • 파일 데이터를 byte[]로 읽는다.
byte[] body = Files.readAllBytes(Paths.get("./webapp" + requestURI))

 

전체 코드

public void run() {
    log.debug("New Client Connect! Connected IP : {}, Port : {}", connection.getInetAddress(),
            connection.getPort());

    try (InputStream in = connection.getInputStream(); OutputStream out = connection.getOutputStream()) {

        BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8"));	// BufferedReader 객체 생성
        String line = br.readLine();	// HTTP 요청 라인 한줄 읽음
        log.debug(line);	# 로깅

        String[] tokens = line.split(" "); // 문자열을 분리함

        while( (line = br.readLine()) != null ) {
            if( line.equals("")) {
                break;	// 헤더 마지막 행은 공백이므로, 라인이 공백이라면 while문을 빠져나옴.
            }
        }

        DataOutputStream dos = new DataOutputStream(out);

        byte[] body = Files.readAllBytes(Paths.get("./webapp" + tokens[1]));	// 요청한 URI에 해당하는 파일을 읽음

        response200Header(dos, body.length);
        responseBody(dos, body);
    } catch (IOException e) {
        log.error(e.getMessage());
    }
}

 

 

한번의 요청이 아닌 여러 번의 요청이 발생

19:31:11.131 [DEBUG] [Thread-6] [webserver.RequestHandler] - GET /index.html HTTP/1.1
19:31:11.164 [DEBUG] [Thread-7] [webserver.RequestHandler] - GET /css/bootstrap.min.css HTTP/1.1
19:31:11.173 [DEBUG] [Thread-8] [webserver.RequestHandler] - GET /css/styles.css HTTP/1.1
19:31:11.173 [DEBUG] [Thread-9] [webserver.RequestHandler] - GET /js/jquery-2.2.0.min.js HTTP/1.1
19:31:11.173 [DEBUG] [Thread-10] [webserver.RequestHandler] - GET /js/bootstrap.min.js HTTP/1.1
19:31:11.174 [DEBUG] [Thread-11] [webserver.RequestHandler] - GET /js/scripts.js HTTP/1.1
19:31:11.219 [DEBUG] [Thread-12] [webserver.RequestHandler] - GET /favicon.ico HTTP/1.1

 

분명 index.html로 요청을 한번 보냈을 뿐인데 한 번의 요청이 아니라, 여러번의 요청이 발생하는 것을 확인할 수 있음

이와 같이 많은 요청이 발생하는 이유는 서버가 웹 페이지를 구성하는 모든 자원(HTML, CSS. JS, 이미지 등)을 한번에 응답으로 보내지 않기 때문이다. 웹 서버는 첫 번째로 index.html 요청에 대한 응답에 HTML만 보낸다. 응답을 받은 브라우저는 HTML 내용을 분석해 CSS, 자바스크립트, 이미지 등의 자원이 포함되어 있으면 서버에 해당 자원을 다시 요청하게 된다.

 

댓글