시소당
이 클래스는 앞에서 설명한 서버소켓을 구현한 클래스이다. 서버소켓은 주어진 포트를 통해 접속해 오는 소켓을 기다리기 때문에 포트번호를 할당받는다. 서버소켓은 한번에 하나의 소켓과 연결이 가능하다. 그렇다면 많은 클라이언트가 거의 동시에 접속해 오면 어떻게 될까? 서버소켓은 클라이언트의 소켓이 접속 요구를 해오면 일단 큐에 저장한다. 그리고 하나씩 꺼내어 새로운 소켓과 연결시킨다. 따라서 큐의 크기가 최대 동시 접속 수이다. 동시 접속 수가 큐의 크기보다 크면 조금이라도 나중에 접속한 소켓은 접속 거부된다. 디폴트로 큐의 크기는 50으로 정해진다.
☞ ServerSocket 클래스의 유용한 생성자
public ServerSocket(int port) throws IOException
port 번호에 해당하는 포트를 통해 기다리는 서버소켓을 만든다.
public ServerSocket(int port, int backlog) throws IOException
port 번호에 해당하는 포트를 통해 기다리는 서버 소켓을 만들고, 큐의 크기를 backlog 값으로 정한다.
public ServerSocket(int port, int backlog, InetAddress bindAddr)
throws IOException
bindAddr을 IP 주소로 하며, port와 backlog가 설정된 서버소켓을 만든다.
※ 만일 서버가 여러 개의 IP 주소를 가지고 있다면 IP 주소를 지정할 수도 있다.
☞ ServerSocket 클래스의 유용한 메소드
public Socket accept() throws IOException
클라이언트의 소켓 접속을 기다리다가 접속되면 소켓을 생성하여 반환한다.
public void close() throws IOException
서버소켓을 닫는다.
public boolean isClosed()
서버 소켓이 닫혔으면 true를, 아니면 false를 반환한다.
public InetAddress getInetAddress()
서버소켓과 결합된 IP 주소를 반환한다.
public int getLocalPort()
서버소켓이 기다리는 포트의 번호를 반환한다.
public void bind(SocketAddress endpoint) throws IOException
endpoint에 해당하는 소켓 주소(IP주소+포트번호)에 결합한다. 이미 결합된 상태이거나 결합할 수 없는 상태이면 예외를 발생시킨다.
public boolean isBound()
서버소켓이 어떤 소켓 주소와 바인드된 상태이면 true를, 아니면 false를 반환한다.
다음 예제는 서버소켓을 테스트해보는 예제이다.
Server1.java
import java.net.*;
import java.io.*;
public class Server1{
public static void main(String[] args){
ServerSocket server=null;
try{
server=new ServerSocket(7777); // x1
System.out.println("서버소켓이 생성되었습니다.");
while(true){ // x2
System.out.println("클라이언트를 기다립니다.");
Socket newSocket=server.accept(); // x3
System.out.println("클라이언트와 연결되었습니다.");
} // x4
}catch(IOException ie){
System.out.println(ie);
}finally{
try{
if(server!=null) server.close(); // x5
}catch(IOException ie){}
}
}
}
출력 결과
서버소켓이 생성되었습니다.
클라이언트를 기다립니다.
x1행에서 7777번 포트를 사용하는 서버소켓 객체를 생성한다. x3행에서 accept 메소드에 의해 클라이언트가 접속해 오도록 기다린다. 어떤 클라이언트가 접속해오면 newSocket과 연결시키고 자신은 x2행과 x4행의 while 문을 돌면서 기다림과 소켓 연결을 반복한다. x5행에서 서버소켓을 닫고 있다. 실제로 접속해오는 클라이언트가 없기 때문에 출력결과와 같이 서버소켓은 계속해서 기다리고 있다. 나중에 서버소켓에 접속하는 클라이언트 소켓을 만들고 실제로 접속해 볼 것이다. isClosed는 1.4이후에 추가된 메소드이므로 1.3이전의 JDK에서는 동작하지 않을 것이다. isClosed를 비롯한 ServetSocket의 몇몇 메소드들은 1.4이후에 추가되었다.