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

Slides:



Advertisements
Similar presentations
명품 JAVA Programming 제 3 장 반복문, 배열, 예외처리.
Advertisements

Chap15 네트워킹 Section 1 : 네트워킹의 개요와 java.net 패키지 Section 2 : 인터넷 주소와 URL
어서와 Java는 처음이지! 제3장선택과 반복.
목차 소켓이란 무엇인가 Socket클래스의 생성자 소켓에 관한 정보 알아내기 소켓 닫기 소켓 옵션 설정하기 소켓 예외
6장 java.applet.Applet의 네트워크 메쏘드들
14. 위피 게임: 가위바위보 게임 초기에 점수=0 처음 이기면 10 점 그 다음부터 이기면 점수=현재 점수*2 지면
어서와 Java는 처음이지! 제2장 자바 프로그래밍 기초.
10. 예외 처리.
Introduction to Servlets
컴퓨터 응용 및 실습 Part1. OOP&Java Programming data type Review
IntArray[0] int length 5 intArray 객체 제 3 장 반복문, 배열, 예외처리.
8장. 네트워크 프로그래밍 /*컴퓨터 네트워크 프로그래밍 -김화종 저- 참조 */
Programming for the java Virtual machine
제14장 원격 메소드 호출 김 기 환. 조 명 휘.
Internet Computing KUT Youn-Hee Han
명품 JAVA Programming 제 13 장 스레드와 멀티태스킹.
명품 JAVA Essential.
12장. JSP에서 자바빈 활용 제12장.
제 12장 예외 처리 12.1 설계 쟁점 12.2 PL/I의 ON-조건 12.3 Ada의 예외 처리
제6장 제어(Control) 6.1 구조적 프로그래밍(Structured Programming)
자바 서버 API와 서블릿 데이타베이스 실험실 이찬섭, 박용문.
Chapter 11 – 예외 처리 Outline 11.1 설계 쟁점 11.2 Pl/I의 예외 처리 11.3 Ada의 예외 처리
5 익셉션 처리.
DB와 WEB 연동(1) [2-Tier] Java Applet 이용
제7장 제어구조 I – 식과 문장.
[ 단원 08 ] 예외처리와 스레드.
메소드 호출과 힙 원격 메소드 호출 서블릿 엔터프라이즈 자바 빈즈
Power Java 제4장 자바 프로그래밍 기초.
10장 객체-지향 프로그래밍 II ©창병모.
8장 자바 입출력.
JAVA 프로그래밍 6장 객체지향프로그래밍의 핵심.
객체지향 언어와 클래스, 객체 ㅎㅎ 개요 클래스의 선언, 객체의 생성 및 속성 참조 방식 멤버 변수 메소드 한빛미디어(주)
01. 직렬화와 역직렬화에 대하여 객체의 직렬화 직렬화와 역직렬화
명품 JAVA Essential.
AOP 개념 및 Spring의 AOP 기능.
10장 SafeTalk 시스템 소프트웨어 연구실 성순화 이재일
명품 JAVA Programming 제 16 장 네트워크.
실전 사운드 처리 프로그래밍 Lecture #11.
명품 Java Programming.
최용술 장 Thread 최용술
명품 JAVA Essential.
Chap07 예외 처리 7.1 예외의 개요 7.2 예외 관련 클래스 7.3 예외 처리.
10장 다중 스레드 10.1 스레드 개요 10.2 Thread 클래스 10.3 스레드 생성
Hadoop 김연왕
2장 자바환경과 자바 프로그램 2.1 자바 개발 환경 2.2 자바 통합환경 2.3 자바 응용 프로그램과 애플릿 프로그램
명품 JAVA Programming 제 15 장 애플릿과 멀티미디어.
DataScience Lab. 박사과정 김희찬 (월)
Android Coding Convention
주소록 프로그램.
Network Programming(1)
자바 5.0 프로그래밍.
12. 컨텐트 핸들러 임정목 국중옥 컴퓨터 네트워크 실험실.
JDBC (Java Database Connectivity)
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
03. 안드로이드를 위한 Java 문법 제목. 03. 안드로이드를 위한 Java 문법 제목.
Ch.1 Iterator Pattern <<interface>> Aggregate +iterator
Chap10 다중 스레드 Section 1 : 스레드 개요 Section 2 : Thread 클래스와 스레드 생명주기
제 2장 어휘구조와 자료형 토 큰 리 터 럴 주 석 자 료 형 배 열 형.
컴퓨터공학실습(I) 3주 인공지능연구실.
JA A V W. 04.
자바 5.0 프로그래밍.
Internet Computing KUT Youn-Hee Han
Java 3장. 자바의 기본 구조 I : 변수, 자료형, 연산자 public class SumTest {
제8장 쓰레드 프로그래밍.
JVM의 구조와 메모리 모델 JVM의 내부 구조 클래스 파일 클래스 로더 메소드(method) 영역 힙(heap) 영역
C# 10장. 참조형.
Java의 정석 제 7 장 객체지향개념 II-3 Java 정석 남궁성 강의
Choi Younghwan CSE HUFS
Chapter8 : 인터페이스와 패키지 8.1 인터페이스 개요와 인터페이스 정의 8.2 인터페이스의 사용
임베디드 프로그래밍 Lecture #
Presentation transcript:

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

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

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

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

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

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://www.host.com:port/file#ref

URLStreamHandler 작성하기(계속) mailto protocol 인 경우 형식 : mailto://elharo@sunsite.unc.edu 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); }

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필드에 저장되어 있다고 가정

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 객체에 저장하기 위해 사용

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

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클래스의 각 필드를 주어진 값으로 설정

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

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

프로토콜 핸들러 작성하기(계속) 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프로토콜의 기본값

프로토콜 핸들러 작성하기(계속) 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 반환

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

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

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

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(); }

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();

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) {

chargenApplet 실행 예

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

프로토콜 핸들러 예제와 기술들(계속) 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 프로토콜의 기본값 서버에서의 현재 시간을 아스키로 나타낸다.

프로토콜 핸들러 예제와 기술들(계속) 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 반환

프로토콜 핸들러 예제와 기술들(계속) 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; } }

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

프로토콜 핸들러 예제와 기술들(계속) 프로토콜 테스트 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");

프로토콜 핸들러 예제와 기술들(계속) 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);

프로토콜 핸들러 예제와 기술들(계속) 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;