Presentation is loading. Please wait.

Presentation is loading. Please wait.

11장. 프로토콜 핸들러 AI &HC I LAB 김 성 현.

Similar presentations


Presentation on theme: "11장. 프로토콜 핸들러 AI &HC I LAB 김 성 현."— Presentation transcript:

1 11장. 프로토콜 핸들러 AI &HC I LAB 김 성 현

2 목 차 프로토콜 핸들러란 무엇인가? URLStreamHandler 작성하기 프로토콜 핸들러 작성하기 URLStreamHandler 생성기 프로토콜 핸들러 예제와 기술들

3 프로토콜 핸들러란 무엇인가? 프로토콜 처리 : 클라이언트와 서버간의 대화를 관리
컨텐트 처리 : 수신받은 데이터에 적합한 무엇인가를 한다는 것 프로토콜 핸들러 메커니즘 : java.net package에 있는 4개의 클래스로 구현 URL : 구체클래스 URLConnection : 추상클래스 URLStreamHandler : 추상클래스 URLStreamHandlerFactory : 인터페이스

4 SUN의 명명법 해당된 URLStreamHandler의 위치는 sun.net. 라는 URLStreamHandler를 찾는다. name은 프로토콜의 이름 : http, news 예 : sun/net/www/protocol/http/handler.class sun/net/www/protocol/chargen/handler.class

5 URLStreamHandler 작성하기
- URL을 나타내는 문자열을 구성요소로 분해하고 URL객체의 각 필드에 값을 설정 - URL에 적합한 URLConnection 객체를 생성 public URLStreamHandler() 생성자는 인자를 갖고 있지 않으며 자신의 subclass의 생성자로부터 호출된다.

6 URLStreamHandler 작성하기(계속)
 protected void parseURL(URL u, String s, int start, int limit) - 문자열 s 를 URL u로 변환 - 임무 : URL 객체 u의 protocol, host, port, file, ref 필드를 채우는 것 - URL이 HTTP의 URL과 비숫한 표현이라 가정 protocol://

7 URLStreamHandler 작성하기(계속)
mailto protocol 인 경우 형식 : String username; Protected void parseURL(URL u, String s, int start, int limit) { StringTockenizer st = new StringTokenizer(spec.substring(start), false); String protocol = st.nextToken(); username = st.nextToken(); String host = st.nextToken(); String file = null; String ref = null; int port = 25; setURL(u, protocol, host, port, file, ref); }

8 URLStreamHandler 작성하기(계속)
 protected String toExternalForm(URL u) URL u의 protocol, host, port, file, ref 필드들을 하나의 문자열로 결합한다. protected String toExternalForm( URL u) { return “mailto:” + u.getFile() + + u.getHost(); } // 사용자 이름이 URL의 file필드에 저장되어 있다고 가정

9 URLStreamHandler 작성하기(계속)
 protected void setURL(URL u, String protocol, String host, int port Sting file, String ref) - URL클래스의 protocol, host, port, file, ref 필드를 주어진 값으로 설정 - parseURL( )메쏘드가 URL을 분해한 후 , 이들을 URL 객체에 저장하기 위해 사용

10 URLStreamHandler 작성하기(계속)
연결을 위한 메쏘드  protected abstract URLConnection openConnection(URL u) throws IOException - URL의 u를 인자로 취하고, 이 u가 가르키는 자원과 URLConnection을 반환한다.

11 URLStreamHandler 작성하기(계속)
예제 1 import java.net.*; import java.io.*; import java.util.*; public class Handler extends java.net.URLStreamHandler { protected URLConnection openConnection(URL u) throws IOException { return new mailtoURLConnection(u); } protected void parseURL(URL u, String spec, int start, int limit) { StringTokenizer st = new StringTokenizer(spec.substring(start), false); String protocol = st.nextToken(); // should be mailto String file = st.nextToken(); //really the username String host = st.nextToken(); String ref = null; int port = 25; setURL(u, protocol, host, port, file, ref); protected String toExternalForm(URL u) { return "mailto:"+ u.getFile() + + u.getHost(); 각 필드를 구문 분석 후 URL클래스의 각 필드를 주어진 값으로 설정

12 프로토콜 핸들러 작성하기 chargen 프로토콜 : RFC864에 규정 - 서버 9번 포트 사용
- 클라이언트를 test 하기 위해 사용 - 서버는 클라이언트가 연결을 끊을 때까지 문자스트림 전송 !”#$%&é ()*+,-./ :;<=>?ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_’abcdefgh ”#$%&é ()*+,-./ :;<=>?ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_’abcdefghi #$%&é ()*+,-./ :;<=>?ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_’abcdefghij $%&é ()*+,-./ :;<=>?ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_’abcdefghijk %&é()*+,-./ :;<=>?ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_’abcdefghijkl &é ()*+,-./ :;<=>?ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_’abcdefghijklm é ()*+,-./ :;<=>?ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_’abcdefghijklmn ()*+,-./ :;<=>?ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_’abcdefghijklmno 화면에 출력 가능 문자 95개 중 에 한 줄에 72개의 문자 출력 - 매번 다른 문자로 시작

13 프로토콜 핸들러 작성하기(계속) URL 표현 형식 - HTTP URL과 비숫한 표현형식으로 만듬
chargen ://hostname:port Content 유형 결정 - getContentType( )이 반환하는 유형 결정 getContentType( ) 가 text/plain을 반환하도록 한다

14 프로토콜 핸들러 작성하기(계속) package sun.net.www.protocol.chargen;
import java.net.*; import java.io.*; public class chargenURLConnection extends URLConnection { Socket theConnection = null; public final static int defaultPort = 19; public chargenURLConnection(URL u) { super(u); } public synchronized InputStream getInputStream() throws IOException { if (!connected) connect(); return theConnection.getInputStream(); Chargen프로토콜의 기본값

15 프로토콜 핸들러 작성하기(계속) public String getContentType() {
return “text/plain”; } public synchronized void connect() throws IOException { int port; if (!connected) { port = url.getPort(); if (port < 0) { port = defaultPort; theConnection = new Socket(url.getHost(), port); connected = true; MIME 형식의 string 반환

16 프로토콜 핸들러 작성하기(계속) Chargen 핸들러 클래스
package sun.net. import java.net.*; import java.io.*; public class Handler extends URLStreamHandler { protected URLConnection openConnection(URL u) throws IOException { return new chargenURLConnection(u); }

17 URLStreamHandler 생성기  public abstract URLStreamHandler
createURLStreamHandler(String protocol) - 지정된 프로토콜을 위한 프로토콜핸들러를 적재

18 URLStreamHandler 설치하기(계속)
Chargen 핸들러 클래스 //package sun.net. import java.net.*; import java.io.*; public class Handler extends URLStreamHandler { protected URLConnection openConnection(URL u) throws IOException { return new chargenURLConnection(u); }

19 URLStreamHandler 설치하기(계속)
import java.applet.Applet; import java.net.*; import java.awt.*; import java.io.*; public class chargenApplet extends Applet implements URLStreamHandlerFactory Runnable { TextArea theText; URL theServer; DataInputStream dis = null; public static void main(String[] args) { Frame f = new Frame("chargen applet"); f.resize(300,300); f.move(50,50); chargenApplet cg = new chargenApplet(); f.add("Center", cg); cg.init(); f.show(); cg.start(); }

20 URLStreamHandler 설치하기(계속)
public void init() { URL.setURLStreamHandlerFactory(this); setLayout(new BorderLayout()); theText = new TextArea(); add("Center", theText); String s = "chargen://sunsite.unc.edu/"; try { theServer = new URL(s); dis = new DataInputStream(theServer.openStream()); } catch (MalformedURLException e) { theText.setText("Error: Could not handle URL " + s); catch (IOException e) { theText.setText("Error: Could not open connection to " + s); theText.appendText("There may not be a chargen server running" + "on this host or network connections may be disallowed."); Thread t = new Thread(this); t.start();

21 URLStreamHandler 설치하기(계속)
public URLStreamHandler createURLStreamHandler(String protocol) ( if (protocol.equalsIgnoreCase("chargen")) { return new chargenURLStreamHandler(); } else { return null; public void run() { try { String theLine; if (dis != null) { while ((theLine = dis.readLine()) != null) { theText.appendText(theLine + ""); catch (IOException e) {

22 chargenApplet 실행 예

23 프로토콜 핸들러 예제와 기술들 프로토콜 핸들러의 작성 단계 1. URL의 설계 : 가능하면 HTTP URL과 유사하게 설계
2. 프로토콜핸들러의 getContentType()메쏘드가 반환할 MIME 유형 설계 3. 프로토콜을 이해하는 URLConnection의 서브 클래스를 만든다 4. URLStreamHandler의 서브클래스를 만들고 URLConnection 서브 클래스의 인스턴스를 반환하는 openConnection()을 구현한다. 5. URLStreamFactory 인터페이스와 createStreamHandler() 메쏘드를 구현한다.

24 프로토콜 핸들러 예제와 기술들(계속) daytimeURLConnection Class import java.net.*;
import java.io.*; public class daytimeURLConnection extends URLConnection { Socket theConnection = null ; public final static int defaultPort = 13; public daytimeURLConnection (URL u) { super(u); } public synchronized InputStream getInputStream() throws IOException { if (!connected) { connect(); Daytime 프로토콜의 기본값 서버에서의 현재 시간을 아스키로 나타낸다.

25 프로토콜 핸들러 예제와 기술들(계속) DataInputStream dis = new DataInputStream(theConnection.getInputStream()); String time = dis.readLine(); String html = "<html><head><title>The Time at " + url.getHost() + "</title></head></body><h1>" + time + "</h1></body></html>"; return new StringBufferInputStream(html); } public String getContentType() { return "text/html"; public Object getContent() { return getInputStream(); 텍스트 데이터를 HTML로 변환 MIME 형식의 string 반환

26 프로토콜 핸들러 예제와 기술들(계속) public synchronized void connect() throws IOException { int port; if (!connected) { port = url.getPort(); if (port < 0) { port = defaultPort; } theConnection = new Socket(url.getHost(), port); connected = true; } }

27 프로토콜 핸들러 예제와 기술들(계속) daytimeURLStreamHandler Class import java.net.*;
import java.io.*; public class daytimeURLStreamHandler extends URLStreamHandler { protected URLConnection openConnection(URL u) throws IOException { return new daytimeURLConnection(u); }

28 프로토콜 핸들러 예제와 기술들(계속) 프로토콜 테스트 import java.io.*; import java.net.*;
public class ProtocolTester implements URLStreamHandlerFactory { String theURL; public static void main (String[] args) { if (args.length == 1) { ProtocolTester pt = new ProtocolTester(args[0]); URL.setURLStreamHandlerFactory(pt); pt.test(); } else { System.err.println("Usage: java ProtocolTester url");

29 프로토콜 핸들러 예제와 기술들(계속) public ProtocolTester(String s) { theURL = s; }
public void test() { String theLine; try { URL u = new URL(theURL); DataInputStream dis = new DataInputStream(u.openStream()); while ((theLine = dis.readLine()) != null) { System.out.println(theLine); catch (IOException e) { System.err.println(e);

30 프로토콜 핸들러 예제와 기술들(계속) public URLStreamHandler createURLStreamHandler(Sting protocol) { protocol = protocol.toLowerCase(); try { Class ph = Class.forName(protocol + "URLStreamHandler"); Object o = ph.newInstance(); return (URLStreamHandler) o; } catch (Exception e) { return null;


Download ppt "11장. 프로토콜 핸들러 AI &HC I LAB 김 성 현."

Similar presentations


Ads by Google