260 likes | 498 Views
8 장 서버 소켓. 프로그래밍 언어 실험실 석사 3 학기 김성중. 제 8 장 목차. 서버 소켓이란 무엇인가 ServerSocket 클래스 생성자들 연결 요청 받기와 연결을 끊기 get 메소드들 소켓 옵션들 객체 메소드들 구현 유용한 서버들. 서버 소켓이란 무엇인가. 소켓 : 네트워크 작업을 바이트 단위로 읽고 쓸 수 있는 스트림처럼 처리 원격 기계에 접속 ( 데이터를 보내고 받을 준비를 한다 .) 데이터를 보낸다 . 데이터를 받는다 . 연결을 끊는다 . 포트에 바인드 한다 .
E N D
8장 서버 소켓 프로그래밍 언어 실험실 석사 3학기 김성중
제 8장 목차 • 서버 소켓이란 무엇인가 • ServerSocket 클래스 • 생성자들 • 연결 요청 받기와 연결을 끊기 • get 메소드들 • 소켓 옵션들 • 객체 메소드들 • 구현 • 유용한 서버들 PL Lab
서버 소켓이란 무엇인가 • 소켓 : 네트워크 작업을 바이트 단위로 읽고 쓸 수 있는 스트림처럼 처리 • 원격 기계에 접속 (데이터를 보내고 받을 준비를 한다.) • 데이터를 보낸다. • 데이터를 받는다. • 연결을 끊는다. • 포트에 바인드 한다. • 들어오는 데이터에 귀를 기울인다. (listen) • 바인드 된 포트를 통해 들어오는 원격 기계의 접속 요청을 받는다. PL Lab
ServerSocket 클래스 • 자바로 서버를 작성하는 데 필요한 모든 것을 포함. • 서버의 기본적인 라이프 사이클 1. 새로운 ServerSocket은 생성자를 이용, 특정포트에 생성된다. 2. accept()메소드를 사용, 연결 요청 신호에 대기 - 연결시 Socket 객체를 반환. 3. 서버의 유형에 따라, getInputStream(), getOutputStream() 4. 서버와 클라이언트는 연결이 끊길때까지 합의된 프로토콜에 따라 대화. 5. 서버, 클라이언트 또는 양쪽에서 연결 종료 6. 서버는 2단계로 돌아가, 다음 연결을 대기 PL Lab
생성자들(1) • public ServerSocket(int port) throws IOException, BindException • 지정된 포트에 대해 ServerSocket생성 • 포트 0면 사용 가능한 임의의 포트 선정(anonmous port) try{ ServerSocket httpd = serverSocket(80); } catch(IOException e) { System.err.println(e) } • 발생할 수 있는 예외상황 • 이미 사용중인 포트 • 1~1023포트: 루트 권한 PL Lab
생성자들(2) • public ServerSocket(int port, int queuelength) throws IOException, BindException • 지정된 포트, 지정된 크기의 큐를 갖는 ServerSocket생성 • 포트 0면 사용 가능한 임의의 포트 선정(anonmous port) • queuelength: 연결요청 신호의 수 try{ ServerSocket httpd = serverSocket(5776, 100); } catch(IOException e) { System.err.println(e) } • 발생할 수 있는 예외상황 • 이미 사용중인 포트 • 1~1023포트: 루트 권한 PL Lab
생성자들(3) • public ServerSocket(int port, int queuelength, InetAddress bindAddress) throws IOException, BindException • 지정된 포트, 지정된 크기의 큐를 갖는 ServerSocket생성 • queuelength: 연결요청 신호의 수 • 지정된 로컬 IP주소에 대해 바인드 • 발생할 수 있는 예외상황 • 이미 사용중인 포트 • 1~1023포트: 루트 권한 PL Lab
생성자들(3) - 예 North Carolina에 SPARC 스테이션 (2개의 네트워크 인터페이스) 1. sunsite.unc.edu (IP: 152.2.254.81, 100Mbps의 FDDI ) 2. calzone.unc.edu (IP: 152.22.81, 10Mbps의 이더넷 카드) try{ ServerSocket httpd = serverSocket(5776, 100, InetAddress.getHostByName("sunsite.unc.edu")); } catch(IOException e) { System.err.println(e) } PL Lab
생성자들(4) • protected ServerSocket() • 프락시 서버를 통과 하거나 보안 프로토콜을 구현하기 위해서 자신만의 SocketImpl을 제공하고자 하는 ServerSocket의 서브 클래스를 위해 사용 PL Lab
연결 요청 받기와 연결을 끊기 • accept() 메소드를 호출 - 봉쇄(block) • accept() 메소드는 Socket 객체를 반환 • getInputStream(), getOutputStream() 메소드 결과사용 try { ServerSocket theServer = new ServerSocket(5776); while(true) { Socket theConnection = theServer.accept(); PrintStream p = new PrintStream ( theConnection.getOutputStream()); p.println("You've connected to this server. Bye-bye now."); } } catch (IOException e) { System.err.println(e); } PL Lab
예제 결과 • 서버 [cse]server> java accept ^C [cse]server> • 클라이어트 [ce]client> telnet cse 5776 Trying 203.247.40.31... Connected to cse.hannam.ac.kr. Escape character is '^]'. You've connected to this server. Bye-bye now. Connection closed by foreign host. [ce]client> PL Lab
daytime 서버 [ce] client>telnet cse 13 Trying 203.247.40.31... Connected to cse.hannam.ac.kr. Escape character is '^]'. Fri May 26 07:18:02 2000 Connection closed by foreign host. [ce] client> [ce] client>telnet cse 1313 Trying 203.247.40.31... Connected to cse.hannam.ac.kr. Escape character is '^]'. Thu May 25 15:20:11 PDT 2000 : Seong_Jung Connection closed by foreign host. [ce] client> PL Lab
public void close() throws IOException • close() 메소드의 호출 : 연결 종료 • ServerSocket의 닫기 • 로컬 포트의 사용 해제 • Socket의 닫기 • 로컬 호스트와 원격 호스트간의 연결 해제 PL Lab
get 메소드들 • public InetAddress GetInetAddress() • 로컬호스트에서 사용되는 주소 반환 [cse]server> java getIPAddr IP Address : 0.0.0.0/0.0.0.0 [cse]server> • public intGetLocalPort() • 소켓이 사용중인 포트번호 반환 • 포트번호 0으로 ServerSocket생성시 임의의 포트번호 선정 • peer-peer방식의 멀티 소켓 프로그램에서 자신의 포트번호 [cse]server>java anon This server runs on port 43620 at 0.0.0.0/0.0.0.0 [cse]server> PL Lab
소켓 옵션들 • SO_TIMEOUT • accept()메소는 java.io.InterruptedIOException이 발생할 때까지 연결 요청을 기다린다. • SO_TIMEOUT이 0 이면, 무한정 • public synchronized void setSoTimeout(int timeout) throws SocketException • SO_TIMEOUT 필드의 값을 설정 • public synchronized int getSoTimeout() throws IOException • 현재 ServerSocket의 SO_TIMEOUT 필드의 설정값 반환 PL Lab
SO_TIME필드 관련 메소드 예제 결과 • setSoTimeut()메소드: [cse]server> java timeOut No connenction within 30 seconds [cse]server> • getSoTimeout() 메소드 [cse]server> java getTimeOut ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=43626] will time out after 30 000 milliseconds [cse]server> PL Lab
객체 메소드들, 구현 • 객체 메소드들 • public String toString() • addr은 항상 0.0.0.0, port는 항상 0 • 자바 1.0 • ServerSocket[addr=0.0.0.0,port=0,localport=5776] • 자바 1.1 • ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=4000] • 구현 • public static synchronized void setSocketFactory (SocketImplFactory fac) throws IOException • public final void implAccept(Socket s) throws IOException • ServerSocket의 서브클래스들은 accept()를 구현하기 위해 PL Lab
유용한 서버들 • 클라이언트 테스트기 • 교재 240쪽 • 클라이언트로부터 입력, 서버로부터 출력의 2개의 쓰레드 • 3개의 클래스 • clientTester • InputThread • OutputThread PL Lab
clientTester 실행 - 서버측 [cse] server>java clientTester 2000 Listening for connections on port 2000 connenction established with Socket[addr=cse.hannam.ac.kr/203.247.40.31,port=436 29,localport=2000] Hannam Univ. Computer Java Network Programming . ^C[cse] server> PL Lab
clientTester 실행 - 클라이언트측 [cse] client>telnet cse.hannam.ac.kr 2000 Trying 203.247.40.31... Connected to cse.hannam.ac.kr. Escape character is '^]'. Hannam Univ. Computer Java Network Programming Connection closed by foreign host. [cse] client> PL Lab
HTTP 서버 • HTTP 서버 • 파일에 대한 요청에 응답 • URL을 로컬 시스템의 파일이름으로 변환 • POST, GET방식의 요청을 처리 • MIME 형식 해석 • 등등 • 단 하나의 파일을 서비스하는 서버 • 교재 244쪽 • 방향 재지정기 • 교재 248쪽 • 완전한 HTTP 서버 • 교재 254쪽 PL Lab
하나의 파일만을 제공하는 서버(1) [cse] server>java onefile index.html 2000 Accepting connections on port2000 Data to be sent: null<HTML> <HEAD> <TITLE>자바 웹서버</TITLE> </HEAD> <BODY> <B>자바</b>로 구현한 <font color=blue>하나의 파일</font>만을 담당하는<BR> HTTP 서버 </BODY> </HTML> PL Lab
하나의 파일만을 제공하는 서버(2) PL Lab
방향재지정기 [cse] server>java Redirector ce.hannam.ac.kr 2000 Redirecting connections on port 2000 to ce.hannam.ac.kr PL Lab
완전한 HTTP 서버 - jhttp [ce] server>java jhttp ~sfline/public_html 2000 Accepting connections on port 2000 Document Root: /lab/sfline/public_html PL Lab