9. Server Socket
Last updated
Last updated
자바에서 일반적인 서버 프로그램의 실행 흐름
ServerSocket() 생성자를 사용해 특정 포트에 대한 새로운 ServerSocket을 생성
ServerSocket은 자신의 accept() 메서드를 사용해 특정 포트로 들어오는 연결 요청을 대기함
accept()는 클라이언트가 연결을 시도할 때까지 블로킹되며 연결이 맺어진 후 Socket객체를 반환함
Socket의 getInputStream() 메서드나 getOutputStream()메서드를 호출하여 클라이언트와 통신에 필요한 입출력 스트림을 얻을 수 있음
미리 정의된 프로토콜에 따라 서버와 클라이언트는 연결 종료 전까지 대화함
서버나 클라이언트 연결을 종료
서버는 2번으로 돌아가서 연결 요청을 대기함.
Socket에서의 예외처리
유닉스/윈도우 등 많은 시스템에서 Ctrl+C로 멈출 수 있음
백그라운드로 실행중인 경우 kill 명령을 사용해 종료시킬 수 있음.
바이너리 데이터 보내기
OutputStream을 사용해 바이트 배열을 전송하면 됨
문자열 전송은 Writer를 사용
멀티스레드 서버
thread pool을 사용하지 않으면 메모리부족(Out of Memory) 문제가 생길 수 있음
소켓으로 서버에 쓰기 & 서버 소켓 닫기
대부분의 프로토콜은 서버에게 읽기와 쓰기 모두 요함
InputStream을 사용해 클라이언트가 보내는 내용을 읽고
OutputStream을 사용해 클라이언트에게 쓴다.
서버 소켓의 사용이 끝났으면 해당 소켓을 닫아야 함. 그래야 다른 프로그램이 해당 포트를 사용할 수 있음
특이한건 Socket Class의 isBound() 메서드는 ServerSocket이 포트에 바인딩 된 적이 있으면 true를 반환함.
→ 때문에 현재 ServerSocket이 열려있는지 확인하려면 isBound()의 값이 true이고 isClosed() 반환값이 false인 두가지 조건을 모두 확인해야 함.!
일반적으로 두 가지 기본적인 내용을 로그에 남긴다.
요청
서버에러
에러 로그는 주로 서버 운영 중에 발생하는 예측되지 않은 예외를 기록한다. 예상치 못한 예외가 발생한 경우에만 사용한다.
발전된 로그 시스템의 경우, 특정 레벨의 로그만을 보여주거나 특정 코드 영역의 로그만 보여주는 분석 툴을 제공
단일 로그파일이나 DB를 이용한 로그 파일 관리 가능.
하나의 로그를 다양한 binary나 프로그램이 공유하는 것도 가능
의미있는 명확한 로그를 남겨야 함
**backlog**
는 서버 소켓이 클라이언트의 연결 요청을 받아들이기 위해 대기할 수 있는 최대 연결 요청 수
소켓 옵션 SocketOptions interface
SO_TIMEOUT
accept() 메서드 동작을 대기하는 밀리초 단위의 시간 양.
0인 경우 무한 대기
SO_REUSEADDR
전송중인 데이터가 있는 경우에도 해당 포트를 바인딩 할 수 있는지 여부 확인
SO_RCVBUF
accept 된 클라이언트 소켓의 기본 수신 버퍼의 크기를 설정