300 likes | 315 Views
자바 네트워크 프로그래밍 (URL,URLEncoder). 프로그래밍 언어 실험실 석사 3 학기 조성대. 목 차. URL 클래스 URLEncoder 클래스 유용한 프로그램들. Java TM 2 Platform S tandard Edition. java.lang.Object. java.applet. java.awt. java.io. ……. java.net. javax.swing. ……. InetAddress. Socket. URL. URLEncoder. ServerSocket. …….
E N D
자바 네트워크 프로그래밍(URL,URLEncoder) 프로그래밍 언어 실험실 석사 3학기 조성대
목 차 • URL 클래스 • URLEncoder 클래스 • 유용한 프로그램들 PL Lab
JavaTM2Platform StandardEdition java.lang.Object java.applet java.awt java.io …… java.net javax.swing …… InetAddress Socket URL URLEncoder ServerSocket …… PL Lab
java.net의 classes과 interfaces • jdk1.2 기준 PL Lab
java.net.URL의 클래스 PL Lab
+ URL 클래스 • java.net.URL • URL (Uniform resource locator)를 추상화 • URL의 구성 • 프로토콜 필드 • 호스트 이름 필드 • 포트 번호 필드 • 경로 필드 • 파일 이름 필드 • 문서의 섹션 필드 • 일반적인 URL의 구성 • http://www.hannam.ac.kr:8080/index.html#ref1 PL Lab
URL 클래스의 생성자 • 생성자 • URL(Stringspec) • URL(Stringprotocol, Stringhost, Stringfile) • URL(Stringprotocol, Stringhost, intport, Stringfile) • URL(Stringprotocol, Stringhost, intport, Stringfile, URLStreamHandlerhandler) • URL(URLcontext, Stringspec) • URL(URLcontext, Stringspec, URLStreamHandlerhandler) • 생성방법 • new URL(…) • 모든 URL 생성자는 MalformedURLException을 발생 • 자바가 지원하지 않는 프로토콜에 대한 URL을 생성하려고 할 경우 발생한다. • HTTP,FTP,news, mailto, gopher, file 지원 PL Lab
URL 클래스의 생성자 • public URL(String url) throws MalformedURLException • 예제 • import java.net.*; public class URLConstructorTest1 { public static void main(String[] args) { URL webURL,ftpURL; try { webURL = new URL(“http://www.macfaq.com/vendor.html”); System.out.println(webURL); ftpURL = new URL(“ftp://ftp.macfaq.com/pub/”); System.out.println(ftpURL); } Catch (MalformedURLException e) { System.err.println(e); }} } • 결과 http://www.macfaq.com/vendor.html java.net.MalformedURLException: ftp//ftp.macfaq.com/pub/:java.lang.Exception PL Lab
URL 클래스의 생성자 • public URL(String protocol, String host, String file) throws MalformedURLException • 포트번호는 –1로 할당하여 기본 값 포트 번호가 사용됨 • file을 나타내는 문자열은 슬래쉬(/)로 시작 • 예제 • try { URL u = new URL(“http”,www.macfaq.com,”/blueribbon.html#intro”); } catch (MalformedURLException e) { System.out.println(e); } PL Lab
URL 클래스의 생성자 • public URL(String protocol, String host, int port, String file) throws MalformedURLException • 기본값 포트 번호가 다를 경우 사용 • 예제 try { URL u = new URL(“http”,”www.eff.org”,80,”/blueribbon.html#intro”); } catch ( MalformedURLException e) { System.err.println(e); } PL Lab
URL 클래스의 생성자 • public URL(URL u, String s) throws MalformedURLException • 상대 URL을 이용하여 절대 URL을 생성할 경우 사용 • 같은 디렉토리 안에 있는 여러 파일을 처리하는 경우 유용 • 예제 • 디렉토리구조 user/public_html/html/examples.html user/public_html/html/vendor.html user/public_html/applet/URLConstructorTest4.class • examples.html <html> <body> <applet code = “.. /applet/URLConstructorTest4.class”> </body> </html> PL Lab
URL 클래스의 생성자 • 예제 • import java.net.*; import java.applet.Applet; public class URLConstructorTest4 extends Applet { public void init() { URL u1, u2; u1 = getDocumentBase(); System.out.println(u1); try { u2 = new URL(u1, “vendor.html”); System.out.println(u2); } Catch (MalformedURLException e) { System.err.println(e); } } } • 결과 • File: user/public_html/html/examples.html File: user/public_html/html/vendor.html PL Lab
URL 조각내기 • URL class의 Methods • Protocol : getProtocol() • Host : getHost() • Port : getPort() • File : getFile() • Ref : getRef() • URLStreamHandler PL Lab
URL class의 Methods • public String getProtocol() • URL의 프로토콜 부분을 String로 반환한다. • public String getHost() • URL의 호스트 이름 부분을 String로 반환한다. • public String getPort() • URL이 지정하고 있는 포트번호를 int로 반환한다. • 포트번호가 명시되지 않으면 –1을 반환 PL Lab
URL class의 Methods • public String getFile() • URL의 경로와 파일 부분을 String로 반환한다. • 호스트이름의 첫 슬래쉬(/)에서 파일내 참조를 알리는 파운드 기호(#)까지의 모든 문자 • 파일이름이 없을 경우 ‘/’를 반환 • public String getRef() • URL의 파일 내 참조 위치를 반환한다. • URL이 파일내 참조위치를 갖고 있지 않을 경우 Null을 반환한다. PL Lab
URL class의 Methods 예제 예제 import java.net.*; public class getURLParts { public static void main(String args[]) { try { URL u = new URL(args[0]); System.out.println( u ); System.out.println( u.getProtocol() ); System.out.println( u.getHost() ); System.out.println( u.getPort() ); System.out.println( u.getFile() ); System.out.println( u.getRef() ); } catch (MalformedURLException e ) { System.out.println( e ); } } } 결과 $ java getURLParts http://www.ncsa.uiuc.edu/demoweb/html-primer.html#A1.3.3 http://www.ncsa.uiuc.edu/demoweb/html-primer.html#A1.3.3 http www.ncsa.uiuc.edu -1 /demoweb/html-primer.html A1.3.3 PL Lab
URL에서 데이터를 가져오기 위한 메소드 • public final InputStream openStream() throws IOException • URL이 가리키고 있는 자원에 연결 • 클라이언트와 서버간의 핸드셰이킹(handshaking) • 데이터를 읽어 들이기 위한 InputStream을 반환 • 파일의 원시 컨텐트를 반환하고 HTML의 헤더나 프로토콜의 정보는 들어 있지 않다. • 예제 URL u = new URL(“http://www.hannam.ac.kr”); DataInputStream theHTML = newDataInputStream(u.openStream()); While ( ( thisLine = theHTML.readLine()) != null ) System.out.println(this.Line); PL Lab
URL에서 데이터를 가져오기 위한 메소드 • public URLConnection openConnection() throws IOException • URL에 소켓을 열고 URLConnection객체를 반환한다. • 네트워크 자원에 대한 연결 • 서버와 직접 통신하기를 원할 때 쓰는 메소드 • 원시형태의 문서와 사용중인 프로토콜의 헤더정보를 볼수 있다. • URLConnection은 10장 참조 • 예제 URL u = new URL(“http://www.hannam.ac.kr”); URLConnection uc = u.openConnection(); PL Lab
URL에서 데이터를 가져오기 위한 메소드 • public final Object getContent() throws IOException • URL에 연결된 데이터를 가져옴. • 특정한 객체의 유형으로 변환하는 특징을 갖는다. • 데이터가 ASCII 또는 HTML이면 InputStream을 반환 • 데이터가 GIF/JPEG 이면 ImageProducer을 반환 • MIME 헤더의 content-type을 사용 • 낯선Content-type을 보내면 ClassNotfoundException을 발생 • 예제 URL u = new URL(“http://www.hannam.ac.kr”); Object o = u.getContent(); URL u = new URL(“http://www.hannam.ac.kr/image/main.gif”); Object o = u.getContent(); PL Lab
URL클래스의 유틸리티 메소드 • public boolean sameFile(URL other) • 두개의 URL이 같은 파일을 가리키고 있는지 조사 • 두 URL의 필드를 조사 • 같은 IP의 주소이고 도메인명이 다를 경우 • 포트번호의 명시의 차이가 날 경우 다른 URL로 취급 • URL객체만 인자로 넘겨질수 있다. • 예제 URL u1 = new URL(“http://www.ncsa.uiuc.edu/HTMLPrimer.html#GS”); URL u2 = new URL(“http://www.ncsa.uiuc.edu/HTMLPrimer.html#HD”); If ( u1.samefile(u2) ) { System.out.println(“the same”); } else { System.out.println(“not the same”); } PL Lab
URL클래스의 객체 메소드 • public boolean equals(Object o) • sameFile()이 갖는 한계를 똑같이 가짐. • 두개의 URL이 같은 파일을 가리키고 있는지 조사 • 두 URL의 필드를 조사 • 같은 IP의 주소이고 도메인명이 다를 경우 • 포트번호의 명시의 차이가 날 경우 다른 URL로 취급 • 어떠한 객체라도 인자로 넘겨질수 있다. • 예제 URL u1 = new URL(“http://sunsite.uiuc.edu/oldnews.html”); URL u2 = new URL(“http://helios.oit.uiuc.edu/oldnews.html”); If ( u1.equals(u2) ) { System.out.println(“the same”); } else { System.out.println(“not the same”); } PL Lab
java.net.URLEncoder 클래스 PL Lab
URLEncoder 클래스 • 로컬운영체제가 다양한 점에 의해 URL에도 문제가 발생 • #,특수문자 비영숫자(non-alphanumeric) • 해결방안으로 URL의 문자를 코드화 • 숫자,밑줄,대소문자가아닌문자는 %와 해당문자의 ASC값에 해당하는 16진수로 표시 • 공백문자는 “+”기호 • “+”기호는 %2b • java.net.URLEncorder클래스의 encode()로 해결 • public static String encode(String s) PL Lab
URLEncoder 클래스의 예제 • 예제 System.out.println(URLEncoder.encode(“This String has spaces”)); System.out.println(URLEncoder.encode(“This*string*has*stars”)); System.out.println(URLEncoder.encode(“This+string+has+plus”)); System.out.println(URLEncoder.encode(“This:string:has:colons”)); System.out.println(URLEncoder.encode(“This.string.has.periods”)); • 결과 This+string+has+spaces This%2astring%2ahas%2astars This%2bstring%2bhas%2bplus This%3astring%3ahas%3acolons This%2estring%2ehas%2eperiods PL Lab
유용한 프로그램들 • 질의문자열 • 문서저장 • GET 방식으로 CGI프로그램과 통신하기 • URLRequestor PL Lab
질의문자열 프로그램 • CGI프로그램에 데이터를 보내기 위해 사용 • 질의 문자열은 이름과 값의 쌍으로이루어짐. • 이름과 값은 =를 기준으로 분리 • 두개의 이름과 값의 쌍을 구분하기위해서 &를 사용 • 예제 username=Elliotte+Rusty+Harold&email=elharo%40sunsite%2eedu 첫번째 쌍의 이름: username 첫번째 쌍의 값 : Elliotte+Rusty+Harold 두번째 쌍의 이름: email 두번째 쌍의 값 : elharo@sunsite.edu PL Lab
QueryString 클래스 import java.net.URLEncoder; public class queryString { String query; public queryString(Object name, Object value) { query = URLEncoder.encode(name.toString()) + “=” + URLencoder.encode(value.toString()); } public void add(Object name, Object value) { query += “&” + URLEncoder.encode(name.toString()) + “=” + URLEncoder.encode(value.toString()); } public String toString() { return query; } } PL Lab
QSTest 실행 public QSTest { public static void main(String[] args) { String name1 = “username”; String value1 = “Elliotte Rusty Harold”; String name2 = “email”; String value2 = “elahro@sunsite.edu”; queryString qs_ = new queryString(name1, value1); qs_.add(name2, value2); System.out.println( qs_.toString() ); } } 결과 % java QSTest username=Elliotte+Rusty+Harold&email=elharo%40sunsite%2eedu PL Lab
GET의 방식으로 CGI프로그램과 통신하기 • CGI프로그램에게 질의문자열을 전달하는 프로그램 PL Lab
lycos 프로그램 import java.net.*; import java.io.*; public class lycos { public static void main(String[] args) { String querystring = ""; for ( int i =0; i<args.length; i++ ) querystring += args[i] + " "; querystring = "query=" + URLEncoder.encode(querystring); try { String thisLine; URL u = new URL("http://www.lycos.com/cgi-bin/pursuit?" + querystring); DataInputStream theHTML = new DataInputStream(u.openStream()); while ((thisLine = theHTML.readLine()) != null) System.out.println(thisLine); } catch (Exception e) { System.err.println(e); } }} PL Lab