TCP ServerSocket, ServerSocket 도식도, ServerSocket 클래스의 생성자, 인자가 없는 서버 소켓 생성자, 인자가 없는 서버 소컷의 일반적인 사용 패턴

CODEDRAGON Development/Java

반응형

 

 

TCP ServerSocket

·       ServerSocket 클래스가 TCP 서버 소켓을 의미합니다.

·       서버측 프로그램은 클라이언트 프로그램에서의 접속 요청을 상시 대기하고 있어야 하는데 이러한 역할을 담당하는 API 입니다. (서버를 작성하기 위해 필요한 모든 것 제공)

·       클라이언트의 TCP 연결을 받기 위해서는 java.net.ServerSocket 클래스의 객체를 생성해야 합니다.

·       ServerSocket 클래스는 네트워크 통신을 수행하기 위해 자신을 바로 사용하는 것이 아니라 클라이언트의 TCP 요청에 대한 Socket 객체를 생성하는 역할을 합니다.

·       ServerSocket 객체를 생성했다면 ServerSocket 클래스의 accept() 메서드는 클라이언트의 TCP 요청이 있을 때 까지 블로킹 되는 메서드이며 클라이언트의 TCP 요청이 오면 accept() 메서드는 클라이언트와 통신할 수 있는 TCP 소켓을 반환합니다.

·       그런 후에 다른 클라이언트의 요청을 기다리게 되므로 일반적으로 accept() 메서드는 무한루프로 처리하게 됩니다.

·       클라이언트의 소켓과 서버에서는 accept() 메서드에 의해 반환되는 소켓을 가지고 스트림을 생성하여 통신하게  됩니다

 

 

ServerSocket 도식도

 

·       자바에서 서버소켓의 기능은 ServerSokcet 클래스에 의해 제공됩니다.

·       ServerSocket 클래스는 특정 포트를 열어놓은 상태에서 대기하고있다가 클라이언트의 접속 요청이 있으면 이를 새로운 소켓으로 연결하여 처리합니다.

·       하나의 서버는 여러 클라이언트의 요청을 동시에 처리해야 하므로 일반적으로 스레드를 이용하게 됩니다.

 

 


 

 

 

ServerSocket 클래스의 생성자

·       서버 소켓 생성자는 TCP 포트번호를 매개변수로 받습니다.

·       만약, TCP 포트번호가 사용중이라면 IOException을 발생시킵니다.

 

생성자

설명

public ServerSocket(int port) throws BindException, IOException

 

·       port를 이용하여 ServerSocket객체를 생성합니다.

·       port는 서버소켓이 사용할 포트 번호입니다.

public ServerSocket(int port, int queueLength) throws BindException, IOException

 

·       queueLength는 클라이언트 요청을 기록할 큐의 크기(동시 연결 요청시 필요)

·       queueLength의 사이즈보다 큰 연결 요청이 많으면 크기 외의 클라이언트는 연결되지 않습니다.

public ServerSocket(int port, int queueLength, InetAddress bindAddress) throws IOException

·       포트와 들어오는 연결 요청을 보관하는 큐의 길이, 바인딩할 로컬네트워크 인터페이스를 명시하여  ServerSocket객체를 생성합니다.

public ServerSocket() throws IOException

 

 

포트 80번에서 HTTP서버에 의해 사용될 서버 소켓을 만드는 코드입니다.

ServerSocket httpd = new ServerSocket (80);

 

포트 80번을 사용하고 동시에 수용되지 않은 연결을 최대 50개까지 보관할 수 있는 큐(Queue)를 가진 서버 소켓을 만드는 코드입니다.

ServerSocket httpd = new ServerSocket (80, 50);

 

 

 

인자가 없는 서버 소켓 생성자

public ServerSocket() throws IOException

인자가 없는 ServerSocket생성자는 실제 포트에 바인딩되지 않은 서버 소켓 객체를 생성하기 때문에 이 생성자를 통해 생성된 서버 소켓 객체는 처음에는 어떠한 연결도 수용할 수 없습니다.

따라서 이 객체는 생성 이후에 bind()메서드를 사용하여 따로 바인딩 해야 합니다. 이러한 기능은 포트에 바인딩 하기 전에 ServerSocket옵션을 설정하는 프로그램에서 주로 사용하게되며 몇몇 옵션의 경우 ServerSocket이 바인딩된 다음에는 변경할 수 없습니다.

public void bind(SocketAddress endpoint) throws IOException

public void bind(SocketAddress endpoint, int queueLength) throws IOException

 

 

 

인자가 없는 서버 소컷의 일반적인 사용 패턴

SocketAddress의 인자로 null을 전달하여 객체를 생성한 후 임의의 포트 지정할 수도 있는데, 이는  ServerSocket생성자의 포트 번호에 0을 전달하는 것과 동일합니다.

아래는 옵션 설정후 바인딩하는 코드입니다.

ServerSocket serverSocket = new ServerSocket();

// 소켓 옵션을 설정

SocketAddress http = new InetSocketAddress(80);

// 서버소켓에 바인딩

serverSocket.bind(http);