Download presentation
Presentation is loading. Please wait.
1
8장 서버 소켓 프로그래밍 언어 실험실 석사 3학기 김성중
2
제 8장 목차 서버 소켓이란 무엇인가 ServerSocket 클래스 유용한 서버들 생성자들 연결 요청 받기와 연결을 끊기
get 메소드들 소켓 옵션들 객체 메소드들 구현 유용한 서버들 PL Lab
3
서버 소켓이란 무엇인가 소켓 : 네트워크 작업을 바이트 단위로 읽고 쓸 수 있는 스트림처럼 처리
원격 기계에 접속 (데이터를 보내고 받을 준비를 한다.) 데이터를 보낸다. 데이터를 받는다. 연결을 끊는다. 포트에 바인드 한다. 들어오는 데이터에 귀를 기울인다. (listen) 바인드 된 포트를 통해 들어오는 원격 기계의 접속 요청을 받는다. PL Lab
4
ServerSocket 클래스 자바로 서버를 작성하는 데 필요한 모든 것을 포함. 서버의 기본적인 라이프 사이클
2. accept()메소드를 사용, 연결 요청 신호에 대기 - 연결시 Socket 객체를 반환. 3. 서버의 유형에 따라, getInputStream(), getOutputStream() 4. 서버와 클라이언트는 연결이 끊길때까지 합의된 프로토콜에 따라 대화. 5. 서버, 클라이언트 또는 양쪽에서 연결 종료 6. 서버는 2단계로 돌아가, 다음 연결을 대기 4단계..무한정 길어질경우 wu-ftpd와 같은 유닉스 서버는 각각의 연결을 처리하기 위해 새로운 프로세스를 생성. 자바는 서버가 다음 연결을 처리할 준비를 하도록 하기 위해 클라이언트와 대화할 쓰래드를 생성. - 서버에 무리를 덜.... 특정한 포트로 들어오는 연결 요청 신호를 선입선출 큐(quee)에 저장하는 것은 운영체제의 임무. 큐의 길이는 일반적으로 50, 운영체제마다 다르다. PL Lab
5
생성자들(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
6
생성자들(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포트: 루트 권한 queuelength보다 크면, 연결 요청을 거절. 최대 큐의 길이보다 큰 값을 설정하면 큐의 길이는 기본값으로 대체. PL Lab
7
생성자들(3) public ServerSocket(int port, int queuelength, InetAddress bindAddress) throws IOException, BindException 지정된 포트, 지정된 크기의 큐를 갖는 ServerSocket생성 queuelength: 연결요청 신호의 수 지정된 로컬 IP주소에 대해 바인드 발생할 수 있는 예외상황 이미 사용중인 포트 1~1023포트: 루트 권한 PL Lab
8
생성자들(3) - 예 North Carolina에 SPARC 스테이션 (2개의 네트워크 인터페이스)
1. sunsite.unc.edu (IP: , 100Mbps의 FDDI ) 2. calzone.unc.edu (IP: , 10Mbps의 이더넷 카드) try{ ServerSocket httpd = serverSocket(5776, 100, InetAddress.getHostByName("sunsite.unc.edu")); } catch(IOException e) { System.err.println(e) PL Lab
9
생성자들(4) protected ServerSocket()
프락시 서버를 통과 하거나 보안 프로토콜을 구현하기 위해서 자신만의 SocketImpl을 제공하고자 하는 ServerSocket의 서브 클래스를 위해 사용 PL Lab
10
연결 요청 받기와 연결을 끊기 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); } accept() 메소드를 호출 - 봉쇄(block) 프로그램의 실행을 멈추고, 클라이언트로부터 연결 요청 신호가 올 때까지 기다린다. PL Lab
11
예제 결과 서버 [cse]server> java accept ^C [cse]server> 클라이어트
[ce]client> telnet cse 5776 Trying 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
12
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: Connection closed by foreign host. [ce] client> [ce] client>telnet cse 1313 Thu May 25 15:20:11 PDT 2000 : Seong_Jung PL Lab
13
public void close() throws IOException
ServerSocket의 닫기 로컬 포트의 사용 해제 Socket의 닫기 로컬 호스트와 원격 호스트간의 연결 해제 PL Lab
14
get 메소드들 public InetAddress GetInetAddress() public intGetLocalPort()
로컬호스트에서 사용되는 주소 반환 [cse]server> java getIPAddr IP Address : / [cse]server> public intGetLocalPort() 소켓이 사용중인 포트번호 반환 포트번호 0으로 ServerSocket생성시 임의의 포트번호 선정 peer-peer방식의 멀티 소켓 프로그램에서 자신의 포트번호 [cse]server>java anon This server runs on port at / PL Lab
15
소켓 옵션들 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
16
SO_TIME필드 관련 메소드 예제 결과 setSoTimeut()메소드: [cse]server> java timeOut
No connenction within 30 seconds [cse]server> getSoTimeout() 메소드 [cse]server> java getTimeOut ServerSocket[addr= / ,port=0,localport=43626] will time out after 30 000 milliseconds PL Lab
17
객체 메소드들, 구현 객체 메소드들 구현 public String toString() 자바 1.0 자바 1.1
객체 메소드들, 구현 객체 메소드들 public String toString() addr은 항상 , port는 항상 0 자바 1.0 ServerSocket[addr= ,port=0,localport=5776] 자바 1.1 ServerSocket[addr= / ,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
18
유용한 서버들 클라이언트 테스트기 교재 240쪽 클라이언트로부터 입력, 서버로부터 출력의 2개의 쓰레드 3개의 클래스
clientTester InputThread OutputThread clientTester - 포트번호를 읽고 그 포트에 대해 서버 소켓을 생성 연결요청 대기 InputThread - 한번에 한바이트씩 읽어..char형으로 변환후 System.out에 출력 OutputThread - System.in으로부터 읽어들여 클라이언트에 전송. PL Lab
19
clientTester 실행 - 서버측 [cse] server>java clientTester 2000
Listening for connections on port 2000 connenction established with Socket[addr=cse.hannam.ac.kr/ ,port=436 29,localport=2000] Hannam Univ. Computer Java Network Programming . ^C[cse] server> PL Lab
20
clientTester 실행 - 클라이언트측
[cse] client>telnet cse.hannam.ac.kr 2000 Trying Connected to cse.hannam.ac.kr. Escape character is '^]'. Hannam Univ. Computer Java Network Programming Connection closed by foreign host. [cse] client> PL Lab
21
HTTP 서버 HTTP 서버 단 하나의 파일을 서비스하는 서버 방향 재지정기 완전한 HTTP 서버 파일에 대한 요청에 응답
URL을 로컬 시스템의 파일이름으로 변환 POST, GET방식의 요청을 처리 MIME 형식 해석 등등 단 하나의 파일을 서비스하는 서버 교재 244쪽 방향 재지정기 교재 248쪽 완전한 HTTP 서버 교재 254쪽 PL Lab
22
하나의 파일만을 제공하는 서버(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
23
하나의 파일만을 제공하는 서버(2) PL Lab
24
방향재지정기 [cse] server>java Redirector ce.hannam.ac.kr 2000
Redirecting connections on port 2000 to ce.hannam.ac.kr PL Lab
25
완전한 HTTP 서버 - jhttp [ce] server>java jhttp ~sfline/public_html 2000
Accepting connections on port 2000 Document Root: /lab/sfline/public_html PL Lab
Similar presentations