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, 자바스크립트, 이미지 등의 자원이 포함되어 있으면 서버에 해당 자원을 다시 요청하게 된다.
'Java' 카테고리의 다른 글
[Java] HTTP 웹 서버 구현 / POST 방식으로 회원가입 (0) | 2023.03.17 |
---|---|
[Java] HTTP 웹 서버 구현 / GET 방식으로 회원가입 (0) | 2023.03.17 |
[Java] 디버깅을 위한 로깅(logging) (0) | 2023.03.10 |
[Java] HashMap이 아닌 LinkedHashMap을 사용하는 이유 (0) | 2023.03.03 |
[Java] 싱글톤 패턴 (0) | 2023.03.01 |
댓글