소켓과 버퍼의 이해에 관한 고찰

현이·2022년 9월 21일
0

고찰

목록 보기
1/6

버퍼는 안에 값이 전부 다 들어와야 비로소 일을 마친다.

무슨 말이냐면

버퍼(바가지)를 만들어 놓고 코드를 이런식으로 짰을 것이다

byte[] buffer = new byte[1024*8];

while(true) {
	int count = socket.getInputStream().read(buffer);
	if ( count == -1 ) break;
}

위 코드에서 선언해둔 byte의 크기만큼 다 read 를 하지 않았다면,
무한정 클라이언트의 데이터만 읽기 위해 기다릴 것이고,
클라이언트가 브라우저를 종료한다면 커넥션이 끊기기 때문에 그제서야 비로소 while 문을 탈출하게 된다.


이 고찰이 어떻게 시작 되었냐면,

위와같이 코드를 짜놓고 브라우저에서 접속한다음 헤더값을 출력하기위해
아래처럼 코드를 짰는데 도저희 출력이 되지않는 것이었다.

for (byte b : buffer) {
	// buffer 값 출력
}

그런데 희한하게도, 브라우저를 끄면 그제서야 콘솔에 데이터들이 막 찍히기 시작을 했는데,
도무지 왜 그런건지 영문을 알 수가 없었다.

하지만 깨닫고야 말았다!!

이유는 즉슨, 브라우저에서 http프로토콜로 요청하는 헤더의 크기는 1024*8 (8kb) 크기를 넘지 않는데,
요청헤더의 크기보다 큰 버퍼를 만들어놓고 버퍼가 다 차기만을 기다리고 있었기 때문이었다!!

그렇다면 어떻게 해야할까?

보통 헤더는 개행문자단위로 끊어진다.
그렇기 때문에 헤더를 파싱해서 마지막 개행문자가 들어왔을때 커넥션을 종료하면 -1이 전송되고 프로그램이 정상적으로 동작한다.

profile
의미있는 고찰

0개의 댓글