본문 바로가기

JAVA/네트워크 프로그래밍

[JAVA] 서버 소켓

서버는 클라이언트를 구현할때 사용하는 소켓만으로는 구현할 수 없다.


클라이언트는 서버와 대화를 할 때를 제외하고는 소켓을 사용하지 않는다는 점도 있고, Socket 객체를 생성하기 위해서는 접속하고자 하는 인터넷 호스트에 대해서 알아야만 한다.


서버를 작성할 때에는 누가 서버에 접속할지, 언제 접속할지는 신경쓰지 않아도 된다.



클라이언트의 연결 요청을 수용하는 서버 프로그램을 위해, 자바는 서버 소켓을 나타내는 ServerSocket 클래스를 제공한다.


서버 소켓은 연결을 기다리며, 연결을 설정한 후 부터는 서버는 반환된 보통의 Socket 객체를 사용하여 클라이언트에게 데이터를 전송한다. 데이터는 항상 반환된 이 보통의 소켓을 통해 보내진다.



ServerSocket을 사용하기 전에...


ServerSocket 클래스는 자바에서 서버를 작성하기 위해 필요한 모든 것을 제공한다

.

새로운 ServerSocket 객체를 만들기 위한 생성자, 특정 포트에서 연결을 대기하는 메소드, 다양한 서버 소켓 옵션을 설정하는 메소드, toString()과 같은 일반적인 메소드를 포함한 다양한 메소드가 그것이다.


자바에서 서버 프로그램의 일반적인 실행 흐름은 다음과 같다.



①  ServerSocket() 생성자를 사용하여 특정 포트에 대한 새로운 ServerSocket을 생성한다.

②  ServerSocket은 자신의 accept() 메소드를 사용하여 특정 포트로 들어오는 연결 요청을 대기한다.

     accept()는 클라이언트가 연결을 시도할 때까지 블로킹되며, 연결이 맺어진 후 클라이언트와 서버를 연결하는

     Socket객체를 반환한다.


③  서버의 유형에 따라 Socket의 getInputStream() 메소드나 getOutputStream() 메소드를 호출하여 클라이언트와 통신에

     필요한 입출력 스트림을 얻을 수 있다.


④  서버와 클라이언트는 연결을 종료하기 전까지 미리 정의된 프로토콜에 따라 대화한다.


⑤  서버나 클라이언트가 또는 둘 다 연결을 종료한다.


⑥  서버는 다시 번으로 돌아가서 다음 연결을 대기한다.