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); |
'Development > Java' 카테고리의 다른 글
URL의 구성요소, 프로토콜 식별자(Protocol Identifier) (0) | 2017.06.05 |
---|---|
URL(Uniform Resource Locator) (0) | 2017.06.05 |
URI 클래스, URI 클래스와 URL클래스 차이, URI 생성자 (0) | 2017.06.05 |
URL 클래스, URL 클래스의 생성자 (0) | 2017.06.05 |
InetAddress 클래스, InetAddress 클래스의 생성자, InetAddress 클래스의 객체 생성 메소드 (0) | 2017.06.05 |