티스토리 뷰
카탈리나 구조
커넥터 (n) ----- 컨테이너 (1)
커넥터 : 요청을 전달해주는 모듈
커넥터는 요청객체와 응답객체를 전달해주고
컨테이너는 service()를 실행
http요청 : 메소드 - 요청url - http버전
요청 헤더
엔티티 본문
헤더와 본문사이는 빈줄로 구분
헤더 시작은 스페이스바 or tab
줄구분은 CRLF(개행)으로 구분
본문이 내용이없어도 CRLF해줘야하지만 안해줄경우도 구현해줘야한다
http응답 : http버전 - 상태코드 - 사유구절
응답 헤더
엔티티 본문
서버소켓 : 연결요청을 기다리는 소켓
서버소켓은 리슨하고있을 바인드주소를 결정해야함 보통 서버컴퓨터(자기자신 127.0.0.1)을 바인드 시킴
백로그 : 최대연결개수 백로그값이 넘어가면 요청거부
리스트 1.2 HttpServer 클래스의 await 메소드
public void await() {
ServerSocket server—Socket = null;
int port = 8080;
try {
ServerSocket = new ServerSocket(port, 1 ,
InetAddress.getByName ("127. 0 . 0 .111 ) ;
}
catch- (lOException. e) {
e .printStackTrace() ;
System.exit(1) ;
}
// 요청을 기다리는 루프
while (!shutdown) {
Socket socket = null;
InputStream input = null;
Outputstream output = null;
try { 一
socket = ServerSocket.accept( ) ;
input = socket.getInputStream( ) ;
output = socket.getOutputStream( ) ;
// Request 객체 생성 몇 parse 호출
Request request = new Request (input);
request.parse( );
//. Resppnse 객체 생성
Response response = new Response(output) ;
response.setRequest{request} ;
response.sendstaticResource( ) ;
/ / 소켓 닫기
socket. close ();
// URL이 총료 명령이었는지를 확인
shutdown = request.getUri().equals{SHUTDOWN_GOMMAND);
}
catch (Exception e) {
e .printStackTrace( ) ;
continue;
}
}
}
서버소켓을 바인드시켜 요청받을준비를 하고
socket = ServerSocket.accept( ); 요청이 오길 기다린다
요청을 받으면 소켓인스턴스를 생성하고 바이트스트림을 읽고쓰기위해
input = socket.getInputStream( ) ;
output = socket.getOutputStream( ) ;
소켓인스턴스의 is, os를 가져온다
Request request = new Request (input);
request.parse( );
요청한내용을 읽어서 요청객체에 담고 요청메세지를 파싱하여 분석한다
Response response = new Response(output) ;
response.setRequest{request} ;
response.sendstaticResource( );
응답객체를 생성하고 응답할 내용을 쓰기위해 os를 인자로 준다
응답객체에 요청메세지를 분석한 내용을 담고
sendstaticResource() 호출
/ / 소켓 닫기
socket. close ();
// URL이 총료 명령이었는지를 확인
shutdown = request.getUri().equals{SHUTDOWN_GOMMAND);
마지막으로 소켓을 닫고 getUri()로 종료명령인지 확인후 맞으면 종료
public class Request {
private InputStream input;
private String u r i;
public Request(InputStream input) {
this. input =. input ;
}
public void pa r s e (){
}
private String parseUri(String requestString) {
}
publ i-c String getUri (} {
return u r i;
}
}
GET /index.htmi HTTP/1. 1
parse 메소드는 위내용을 inputStream이 요청 바이트스트림을 모두 읽어서 바이트배열에 저장함
그 바이트배열에 저장된것을 읽어서 request라는 이름의 StringBuffer에 저장
StringBuffer를 String으로 변환하여 parseUri에 인자로 전달한다
parseUri는 필드사이의 공백으로 구분하여 url을 알아낸다
response os를 인자로 생성됨 (응답을 쓰기위해서)
setRequest : 분석끝난 request객체를 담아서 보냄(응답)
sendStaticResource : 정적자원을 보냄 File을 이용하여 url에 맞는 파일을 찾아서 생성시켜줌 없으면 에러발생 가공하지않는 데이터 그대로 보냄