[서블릿 컨테이너의 이해]

public class Server_0 {

	public static void main(String[] args) throws IOException {
    	Server_0 serve = new Server_0();
        server.boot();
    }
    
	private void boot() throws IOException {
    
    	serverSocket = new ServerSocket(8000); // 8000번 포트 가진 소켓 생성
        Socket socket = serverSocket.accept();
        InputStream in = socket.getInputStream();
        OutputStream out = socket.getOutputStream();
        
        int oneInt = -1;
        
        while(-1 != (oneInt = in.read())) { // read메서드가 -1을 반환하면 종료한다.
        	// InputStream의 read 메서드는 소켓에서 얻은 스트림의 연결이 끊어질 경우에 -1을 반환한다.
            // 따라서 웹 브라우저의 [x] 버튼을 사용해 연결을 종료하면 루프탈출한다.
        	System.out.print((char)oneInt); // 표준출력에 표시
        }
        
        out.close();
        in.close();
        socket.close();
    }    
    private ServerSocket serverSocket;
}

 

이후 컴파일하고 (java -d ...) 실행한다 (java -cp ...)

웹 브라우저에서 http://localhost:8000을 호출한다.

웹 브라우저가 8000번 포트로 HTTP 요청을 보내고 서버 명령창에서 HTTP GET 요청을 확인할 수 있다.

 

이 구조는 메세지의 끝을 '연결종료'로만 파악하기 때문에 좋지 않다. 왜냐하면 양방향 통신에 대해 요청에 대한 응답을 보낼 수 없기 때문이다. [x]를 눌러 이미 연결이 종료됐으므로.

=> 서블릿 컨테이너는 스트림을 사용해 Socket에서 한 바이트씩 읽어들이며 어느 시점에서 읽기를 중단할지 등을 판단한다. 이런 상태를 분석하는 코드를 HTTP 상태 기계라고 한다.