SSISO Community

시소당

ServerSocket 클래스

이  클래스는  앞에서  설명한  서버소켓을  구현한  클래스이다.  서버소켓은  주어진  포트를  통해  접속해  오는  소켓을  기다리기  때문에  포트번호를  할당받는다.  서버소켓은  한번에  하나의  소켓과  연결이  가능하다.  그렇다면  많은  클라이언트가  거의  동시에  접속해  오면  어떻게  될까?  서버소켓은  클라이언트의  소켓이  접속  요구를  해오면  일단  큐에  저장한다.  그리고  하나씩  꺼내어  새로운  소켓과  연결시킨다.  따라서  큐의  크기가  최대  동시  접속  수이다.  동시  접속  수가  큐의  크기보다  크면  조금이라도  나중에  접속한  소켓은  접속  거부된다.  디폴트로  큐의  크기는  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이후에  추가되었다.  

1150 view

4.0 stars