Request Header 직접 읽기
- Request Header을 직접 읽어 파싱하는 과정을 통해 원하는 작업을 진행할 수 있다.
try (InputStream in = connection.getInputStream(); OutputStream out = connection.getOutputStream()) {
BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8"));
이 코드를 한번 분석해보자. InputStream, InputStreamReader, BufferedReader순으로 작성되어 있다.
각각의 역할은 다음과 같다.
●InputStream
Stream이라는 것에 대해 먼저 이해를 해야한다.스트림이란 데이터가 출발지에서 도착지로 단방향으로 흘러가는 것을 의미한다.
이 때, 프로세스가 데이터의 도착지라면 입력 스트림(InputStream), 프로세스가 데이터의 출발지라면 출력 스트림(OutputStream) 이라고 불린다. 기준은 항상 프로그램이다.
스트림에는 바이트 기반 스트림과 문자 기반 스트림이 있다. 바이트 기반 스트림은 문자, 그림, 영상 등 다양한 형태의 파일을 처리할 수 있지만, 문자 기반 스트림은 오로지 문자만 처리할 수 있다.
●InputStreamReader
inputStream이 바이트 단위로 읽어준 파일을 다시 문자 스트림으로 변환하는 것이다.
여기서 사용하는 이유는 BufferedReader이 문자 스트림에 버퍼링 기능을 추가해주는 것이기 때문이다. 즉 InputStream 에서 바이트 스트림으로 읽어온 정보를 처리할 수 없기 때문에 문자 스트림으로 변경해서 전달해주는 것이다.
●BufferedReader
버퍼링을 통해 입력 성능을 향상시킴과 동시에 read(), readLine()같은 메서드를 제공함으로써 파싱을 용이하게 할 수 있게 하기 위해 사용된다.
String line = br.readLine();
String[] url = line.split(" ");
이후에 한 줄을 읽은 뒤에 이 정보를 파싱하여 필요한 정보에 맞는 것을 추출하면 된다.
최종적으로 아래와 같은 정보를 얻을 수 있게 된다.
GET
/index.html
HTTP/1.1
파일 읽기
File file = new File(filePath);
byte[] body = readFileToByteArray(file);
response200Header(dos, body.length, contentType);
responseBody(dos, body);
private void response200Header(DataOutputStream dos, int lengthOfBodyContent, String contentType) {
try {
dos.writeBytes("HTTP/1.1 200 OK \r\n");
dos.writeBytes("Content-Type: " + contentType + "\r\n");
dos.writeBytes("Content-Length: " + lengthOfBodyContent + "\r\n");
dos.writeBytes("\r\n");
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
}
private void responseBody(DataOutputStream dos, byte[] body) {
try {
dos.write(body, 0, body.length);
dos.flush();
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
}
java.io.File 에 있는 메소드를 이용한다. 파일의 경로를 전송해 파일을 읽어오고, readFileToByteArray로 파일의 정보를 바이트 단위로 배열에 저장한다.
이후 DataOutputStream을 구성하기 위해 헤더와 바디를 작성해준 뒤에 전송하면 된다.
'지식 정리 > JAVA' 카테고리의 다른 글
[JAVA] HashMap의 동시성 문제 (2) | 2025.06.29 |
---|---|
[JAVA] java의 람다란? (2) | 2024.11.19 |
Http Request, metod, header, response, MIME (0) | 2024.07.06 |
쓰레드, 동기, 쓰레드풀, Runnable, Callable, Future (0) | 2024.07.04 |