2013년 10월 18일 금요일

ServerSocket Class

ServerSocket Class
서버 구현의 기본은 특정한 로컬 포트에 대해 ServerSocket 객체를 열고 클라이언트가 연결해 오기를 기다리는 것이다.
클라이언트가 연결해 올때마다 ServerSocket은 각각의 클라이언트 연결에 대해 Socket 객체를 생성한다. 
ServerSocket은 대개 InputStream이나 OutputStream을 통해 클라이언트와 데이터를 주고 받는다.
Port번호는 1~65535까지 사용 가능하며 이중 1~1023 까지는 시스템 서비스 용으로 예약 되어있다.



소켓 생성시 포트 번호를 0으로 주는 것은 시스템에서 알아서 포트를 할당 하라는 의미이다.
ServerSocket 객체가 생성되자 마자 운영체제가 클라이언트로 부터 연결을 받을 준비를 한다. 클라이언트가 시도한 연결은 Queue에 들어가며 서버가 accept 메소드를 호출하면 하나씩 큐에서 빠져 나온다.
ServerSocket 생성시 몇 개의 연결을 Queue에 넣을 것인지 지정 할 수 있다.




Constructor
ServerSocket(int port) 
Creates a server socket on a specified port. 
The maximum queue length for incoming connection indications (a request to connect) is set to 50. If a connection indication arrives when the queue is full, the connection is refused. 




Constructor
ServerSocket(int port, int backlog) 
Creates a server socket and binds it to the specified local port number, with the specified backlog. 
The maximum queue length for incoming connection indications (a request to connect) is set to the backlog parameter. If a connection indication arrives when the queue is full, the connection is refused


서버 소켓 생성시 인자없는 생성자는 BIND 되지 않은 서버소켓을 만들며 인자로 포트번호를 준 경우에는 그 포트번호를 이용해 BIND된 서버 소켓을 만든다.(포트번호는 1에서 65535까지이며 0인 경우는 아무숫자나 활당하라는 의미이다.)
backlog라는 인자를 지정하지 않으면 default로 50이 지정되며 지정된 수를 넘어서면 접속을 거부 당한다.
서버소켓을 생성시 InetAddress형을 주는 경우는 서버에 Network Card가 여러 개 있는 경우이다.




서버소켓(ServerSocket)의  accept()메소드는 BIND된 서버 소켓에게 접속을 기다리도록 지시한다. 그래서 접속을 해오는 소켓이 있을때 까지 이 메소드는 blocking되기 때문에 접속이 있을때까지 마냥 기다리게 된다. 속
서버소켓(ServerSocket)에서 가장 중요한 메소드는 accept() 메소드이며 보통 네크웍 프로그래밍을 할때 accept() 메소드를 이용하여 많은 접속을 받아 들이므로 이런 코드는 Thread의 run() 메소드안에 있는 경우가 대부분 이다.




------------ Server Process Model

1) ServerSocket을 생성 - ServerSocket(포트번호, 큐의 크기)
서버 소켓은 클라이언트의 접속을 받는 부분
포트번호는 서버 프로세스가 갖는 구별 번호. 시스템에서는 216개를 정의하여 사용. 0~1024:슈퍼유저용, 1024~4000:예약, 4000~65535:사용 권고
FTP:21, telnet:23, E-mail:25, HTTP:80
큐의 크기는 서버에 한 번에 접속이 가능한 클라이언트의 수를 결정
2) 클라이언트의 접속을 받아 들임 – Socket=ServerSocket.accept()
클라이언트로부터 들어오는 신호가 있는 지를 감시(listen)하여 클라이언트와의 접속을 개시. 접속이 완료된 시점에서 소켓이 만들어 짐



3) 클라이언트와 자료를 전송하고 수신함
생성된 소켓에서 출력 스트림(자료 전송용)과 입력 스트림(자료 수신용)을 받아서 사용.
4) 연결을 종료함
전송과 수신이 완료되면 클라이언트와의 연결을 끊게 되고 다른 클라이언트에게 서비스를 함.



------------------------ Client Process Model

1) Socket을 생성 
Socket(호스트 이름, 포트번호)
호스트 이름 : 서버 프로세스가 설치되어 
있는 시스템의 이름. 자신의 시스템인 경우 
“localhost”를 이용
2) 서버와 자료를 전송하고 수신
생성된 소켓에서 출력 스트림(자료 전송용)과 입력 스트림(자료 수신용)을 받아서 사용.
3) 연결을 종료
전송과 수신이 완료되었으면 서버와의 연결을 끊게됨




------------------------------- LocalPortScanner.java

import java.net.*;  
import java.io.*; 
public class LocalPortScanner { 
public static void main(String[] args) { 
  for (int port = 1; port <= 65535; port++) { 
try { 
ServerSocket server = new ServerSocket(port); 

  catch (IOException e)  { 
    System.out.println("There is a server on port " + port + "."); 
}   
  } 
    } 



댓글 없음:

댓글 쓰기