프로그램/java&eclipse2014. 8. 14. 21:33



 JAR 이란?
 


클래스 파일의 효율적인 배포를 위해 여러 클래스 파일들을 하나로 묶어 단일의 파일로 만드는 포멧. 로컬(local)상에서 편리한 관리는 물론 자바(Java) 프로그램 실행 중에 원격지에서 하이퍼텍스트 전송 규약(HTTP) 등을 통해 내려받기(download)되어 바로 사용이 가능하다.            -네이버 용어사전-

 JAR 생성 방법
 

1. 일반 파일
   


Sample1.java, Sample2.java, Sample3.java 클래스 파일을 만들었습니다.


File(1) → Export(2) 선택하면 Export 창이 나옵니다.
JAR File(3) 을 선택하고 Next(4) 클릭한다.


Browse(1) 을 클릭하여 jar 파일을 저장할 장소를 선택하고 Next(2) 을 클릭합니다.


Next 을 클릭한다.


클래스 파일 1개를 jar 파일로 만드는 작업은 FInish 를 클릭하면 되지만 여러개의 클래스 파일을 jar 파일로 만들기 위해서는 Main class 를 지정해줘야 합니다. Main class 를 지정하지 않으면 Sample1, 
Sample2, Sample3 의 클래스 파일 중 어느 파일이 Main class 인지 알 수가 없어서 jar 파일 실행시 에러를 발생합니다.

2. 패키지 파일
   


Sample1, 
Sample2, Sample3 클래스 파일을 Pack 패키지로 묶어서 jar 파일을 생성하였습니다. 이클립스에서는 일반파일의 jar 파일 생성 방법과 동일합니다.


일반 클래스 파일과 패키지 클래스 파일 을 각각 Sample.jar 과 Sample_pack.jar 로 만들고 jar 파일을 압축을 해제한 후 비교를 했습니다.

1. 클래스 파일 위치가 다르다.
일반 클래스 파일로 만든 jar 파일 안에는 클래스 파일이 바로 존재하지만, 패키지 클래스 파일로 만든 jar 파일 안에는 Pack 디렉토리(패키지) 안에 클래스 파일이 존재합니다.

2. MANIFEST.MF 파일의 Main-Class 가 다르다.
일반 클래스 파일로 만든 jar 파일의 Main-Class 는 클래스명을 사용하지만, 패키지 클래스 파일로 만든 jar 파일의 Main-Class 는 패키지명.클래스명 을 사용합니다.

 JAR 실행 방법
 

Browse 을 클릭하여 Main class 를 선택하고 Finish 를 클릭하면 Sample.jar 파일이 생성됩니다.
jar 파일은 더블클릭으로 실행하거나 java -jar 파일.jar 명령어로 실행시킬 수 있습니다.


JAR 파일을 실행파일(EXE) 파일로 만들기  ☞  http://pangsan.tistory.com/125
Posted by wrnly
프로그램/java&eclipse2014. 3. 23. 21:19

 

? 

소켓에서 우리가 입력한 문자열을 바이트알갱이로 바꿔서 OuputStream으로 밀어내면

서버소켓에서는 InputStream으로 읽어드린다.

String타입을 다룰때는 BufferedWriter가 더 편하고 좋다.

하지만 사진이나 파일전송은 바이트알갱이로 되어있는것은 OutputStream을 쓰면 된다

 

package test.ex1;

import java.net.Socket;

/*
 *  [ 클라이언트 프로그램 작성순서 ]
 * 
 *   1. Socket 객체생성 : 생성됨과 동시에 서버에 소켓 접속을 시도함
 *    접속할 서버의 ip주소와 port번호가 필요함
 *   2. Socket 객체를 이용해서 서버와 통신하기
 * 
 *   3. 필요한 작업을 완료 후 Socket 닫아주기
 * 
 */
public class Client {
  public static void main(String[] args) {
  //필요한 객체 초기화 하기
   Socket socket=null;
   try{
    //Socket객체를 생성하면서 ip 주소와 port 번호전달
    socket = new Socket("127.0.0.1",500);   => 객체생성

    System.out.println("서버에 접속 성공");
   }catch(Exception e){
    e.printStackTrace();
   }finally{
    try{
     socket.close();
    }catch(Exception e){}
   }
 }

 

-----------------------

 

package test.ex1;

import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

/*
 *  [서버 프로그램 작성순서 ]
 *
 *   1. ServerSocket 객체를 생성한다. (port 번호 필요)
 *   2. 클라이언트의 접속을 기다리고 있다가 접속해오면 이를 받아들인다.
 *   3. Socket 객체를 클라이언트와 통신을 하고 ServerSocket 객체는 다시
 *    클라이언트의 접속을 기다린다.
 *   4. 클라이언트와 접속을 종료하려면 socket 객체를 닫아준다.
 */
public class Server {
 public static void main(String[] args) {
  //필요한 객체 초기화
  ServerSocket server=null;
  Socket socket= null;
  try{
   //5000번 port 를 열고 클라이언트의 접속을 기다린다.
   server = new ServerSocket(5000);
   System.out.println("클라이언트의 접속을 기다리는 중.....");
   //접속 요청이 올때 까지 블로킹 되는 메소드
   socket = server.accept(); //잡혀있어요.. 메소드를 리턴하지 않아요.누군가접속을하면
   //클라이언트의 ip주소에 대한 정보를 갖는 객체 얻어오기
   InetAddress iAddr=socket.getInetAddress(); //반환되는 소켓을 받아온다
   //ip주소 얻어오기
   String clientIp=iAddr.getHostAddress();
   System.out.println(clientIp+"가 접속했습니다.");
   
  }catch(Exception e){
   e.printStackTrace();
  }finally{
   try{
    socket.close();
    socket.close();
   }catch(Exception e){}
  }//try
 }//main()

---------------------------------------------


 

 

Posted by wrnly
프로그램/java&eclipse2014. 3. 23. 21:18

사용환경 : win2000, apache tomcat 4.0.2

다른 jsp는 제대로 되는데...
class연결하면 안되거든요...

아래 소스입니다.
hello.jsp 소스입니다.
ROOT밑에 test라는 폴더를 만들어 넣었습니다.

<html>
<title>use bean</title>
<body>
<jsp:useBean id="hello" class="HelloBean"/>
<jsp:setProperty name="hello" property="name" param="name" /> Hello, <jsp:getProperty name="hello" property="name" />
</body> </html>

HelloBean.java 소스입니다.
javac HelloBean.java해서
HelloBean.class를 ROOT밑에 WEB-INF밑에 classes밑에 넣었습니다.

public class HelloBean implements java.io.Serializable {
String name;

public HelloBean () {
this.name = "World";
}
public String getName () {
return name;
}
public void setName (String name) {
this.name = name;
}
}

 

-----------------------------------

<%@ page import="HelloBean"%> 줄을 추가해주세요.

Posted by wrnly
프로그램/java&eclipse2014. 3. 23. 21:16

1. Inner class

  • 클래스 자체가 다른 클래스내부 또는 메소드 내부에 존재하는 것을 말한다.
  • 중첩 클래스라고도 불린다.
  • 정적(static) 클래스는 내부 클래스로 인정되지 않는다.
  • interface는 무조건 정적으로 선언되므로 내부 인터페이스란 아예 존재하지 않는다.
  • 특정 외부 클래스에게는 public으로 선언되고 다른 클래스에게는 private로 접근 제어를 하고자 할때 사용된다.

- Inner class의 종류

  • 중첩된 최상의 클래스
  • 클래스 멤버 클래스
  • 지역 클래스
  • 익명 클래스

2. 중첩된 최상의 클래스

  • 클래스 안에서 특정 메소드에 소속되지 않는 상태로 선언되고 사용되는 클래스
  • 다른 클래스안에서 정적(static)형으로 선언된 클래스.
  • 자신이 포함된 클래스의 정적 메버들을 다룰 수 있다.
  • 다른 클래스를 작성할 때 'import'문을 사용할 수 있다.
  • 인터페이스는 무조건 묵시적으로 정적으로 선언된다.

1) 실예

  1. // =====================================================
  2. // static inner class Test
  3. // make : pwg
  4. // date : 2003
  5. // =====================================================
  6. class innerClass3
  7. {
  8.         static int su=10;
  9.         
  10.         int su2=20;
  11.         
  12.         // 중첩된 최상위 클래스
  13.         static class test
  14.         {
  15.                 int su3=su;
  16.         
  17.         }
  18.         
  19.         public static void main(String args[])
  20.         {
  21.                 innerClass3 ic3=new innerClass3();
  22.                 System.out.println(ic3.su);
  23.                 
  24.                 // inner class object
  25.                 innerClass3.test t=new innerClass3.test();
  26.                 System.out.println(t.su3);
  27.                 
  28.         }
  29. }

3. 클래스 멤버 클래스

  • 다른 클래스의 비정적클래스로 선언된 클래스
  • 외부 클래스의 모든 멤버들을 제어할 수 있다.
  • 외부 클래스가 인스턴스화 될 때 포함되는 형식으로 존재한다. 따라서 외부 클래스가 인스턴스화 되지 않으면 참조할 수 없다.
  • 이벤트를 처리할 때 가장 많이 사용하는 방법이다.
  1. // =====================================================
  2. // member inner class test
  3. // make : pwg
  4. // date : 2003
  5. // =====================================================
  6. import java.awt.*;
  7. import java.awt.event.*;
  8. class innerClass4 extends Frame
  9. {
  10.         Button b=new Button("exit");
  11.         myActionListener myAction = new myActionListener();
  12.         
  13.         public innerClass4()
  14.         {
  15.                 setLayout(null);
  16.                 setSize(400,400);
  17.                 b.setBounds(100,100,100,100);
  18.                 b.addActionListener(myAction);
  19.                 add(b);
  20.         }
  21.         
  22.         public static void main(String args[])
  23.         {
  24.                 innerClass4 ic4=new innerClass4();
  25.                 ic4.setVisible(true);
  26.         }
  27.         
  28.         // method type inner class
  29.         class myActionListener implements ActionListener
  30.         {
  31.                 public void actionPerformed(ActionEvent ev)
  32.                 {
  33.                         System.exit(0);
  34.                 }
  35.         }
  36. }

4. 지역 클래스(Local Class)

  • 메소드의 블록안에서 선언된 클래스를 말한다.
  • 정적으로 선언될 수 없다.
  • 비정적인 메소드에서 선언된 클래스인 경우 자신이 포함된 클래스의 모든 멤버를 참조할 수 있다.
  • 정적 메소드에서 선언된 클래스인 경우는 자신이 포함된 클래스의 정적 멤버들만 참조할 수 있다.

1) 실예

  1. // ==================================================
  2. // inner Class test
  3. // Local inner class
  4. // make : pwg
  5. // date : 2003.
  6. // ==================================================
  7. public class innerClass2
  8. {
  9.         String name = "park";
  10.         public innerClass2()
  11.         {
  12.         }
  13.         
  14.         public void method()
  15.         {
  16.                 class inner // 메소드안에서 선언되 클래스(Local Class)
  17.                 {
  18.                         public void prn()
  19.                         {
  20.                                 System.out.println(name);
  21.                         }
  22.                 }
  23.                 
  24.                 inner inc=new inner();
  25.                 inc.prn();
  26.         }
  27.         
  28.         public static void main(String args[])
  29.         {
  30.                 innerClass2 ic2=new innerClass2();
  31.                 ic2.method();
  32.                 
  33.         }
  34. }

5. 익명 클래스(Anonymous Class)

  • 클래스의 상속과 객체 생성을 동시에 할수 있다.
  • 객체를 한번만 생성하거나, 클래스가 간단한 구조로 되어 있을때 사용한다.
  • 정적(static)형 멤버를 가지지 못한다.

1) 선언형식

  1. // 클래스 유형
  2. new 클래스생성자(){
  3.         멤버 선언...
  4.         {초기화 블럭}
  5.          메소드 선언(){ ... }
  6. ...
  7. }
  1. // 인터페이스 유형
  2. new 인터페이스명(){
  3.          메소드명(){};
  4. ....
  5. }

2) 실예

  1.  // ==================================================
  2. // inner Class test
  3. // Anonymous inner class
  4. // make : pwg
  5. // date : 2003.
  6. // ==================================================
  7. import java.awt.*; // Frame을 사용하기 위해
  8. import java.awt.event.*; // ActionListenner를 사용하기 위해
  9. public class innerClass1 extends Frame
  10. {
  11.         Button exitButton = new Button("Exit");
  12.         public innerClass1()
  13.         {
  14.                 this.setSize(400,400);
  15.                 this.setLayout(null);
  16.         
  17.                 exitButton.setBounds(100,100,100,100);
  18.                 exitButton.addActionListener(
  19.                         // 익명 클래스 시작
  20.                         new ActionListener()
  21.                         {
  22.                                 public void actionPerformed(ActionEvent ev)
  23.                                 {
  24.                                         System.exit(0);
  25.                                 }
  26.                         }       
  27.                         
  28.                 );
  29.                 this.add(exitButton);
  30.         }
  31.         
  32.         public static void main(String args[])
  33.         {
  34.                 innerClass1 ic=new innerClass1();
  35.                 ic.setVisible(true);
  36.         }
  37. }
Posted by wrnly
프로그램/java&eclipse2014. 3. 23. 21:14

public 은 모든 class 에서 접근이 가능한 개방형 생성자 이고

private는 자신의 class 내에서만 접근이 가능한 제한적 생성자 인걸로 알고 있습니다.

protected는 자기 자신 또는 상속받은 클래스나 sub 클래스에서 접근이 가능한

-----------------------------------------------------------------------------------


다음 클래스는 모든 엔터프레임을 중앙에서 실행 시킬 수 있도록 하는 클래스입니다. 일시 정지 기능도 있습니다.
package org.raongames
{
import flash.display.DisplayObject;
import flash.display.Shape;
import flash.events.Event;

public class CentralEnterFrame
{
private static var me:CentralEnterFrame=new CentralEnterFrame();
private var _do:DisplayObject;
private var _list:Vector.<Function>;//function 관리용
public function CentralEnterFrame()
{
if(me!=null) {
throw new Error("Singleton");
}
init();
}
private function init():void
{
_do=new Shape;//EnterFrame
_list=new Vector.<Function>;
start();
}
public static function get obj():CentralEnterFrame {
return me;
}
public function addListener(func:Function):void
{
if(func==null) {
throw new ArgumentError("Func must not be null");
}
if(_list.indexOf(func)>=0) { //등록 되어있으면 추가 안함
return;
}
_list.push(func);
}
public function removeListener(func:Function):void
{
if(func==null) {
throw new ArgumentError("Func must not be null");
}
var i:int=_list.indexOf(func);
if(i==-1) return;
_list.splice(i, 1);
}
public function start():void
{
_do.addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
public function stop():void
{
_do.removeEventListener(Event.ENTER_FRAME, onEnterFrame);
}
private function onEnterFrame(e:Event):void
{
for each(var f:Function in _list) {
f();
}
}
}
}


메서드의 내용보다는 역할에 주목하시길 바랍니다.
참고로 이 클래스는 싱글턴 패턴이란것을 이용하고 있습니다. 당장 배울 때 중요한것은 아니니까
속성 me랑 getter메서드 obj()는 무시하시길 바랍니다.

여기서 _do는 displayObject로 EnterFrame이벤트를 걸기 위해서 사용하는 것입니다. 근데 외부에서 이 변수를 굳이 알고 있어야 할 이유는 없죠. 외부에서 원하는것은 엔터프레임을 모두 중앙에서 관리한다는 것이지, 중앙에서 관리하기 위해서 어떤 것들이 필요한지는 몰라도 되죠. 즉 영화를 보려고 영화관에 갔으면 영화만 보고 오면되지 굳이 어디서 영사기를 쏘고 어디서 필름을 넣어주고 하는 것들은 몰라도 된다는 것입니다. 마찬가지로 _list에 보관되어 있는 엔터프레임마다 실행할 함수의 목록들을 외부에서는 몰라도 됩니다. 그래서 private인 것입니다. 클래스는 외부에서 필요로 하는 것만 노출시키면 됩니다. 이 클래스에서도 외부에서 리스너를 등록하고 해지하는 기능이 필요하기 때문에 addListener()와 removeListener()을 public 으로 설정하고 있습니다. 이 메서드 마저 private이라면 외부에서 리스너를 등록도 해지도 못하겠죠. start()와 stop()도 일시정지를 위해서 외부에서 필요하는 기능이기 때문에 public으로 둡니다. 반면 onEnterFrame()은 _do의 엔터프레임에 걸린 리스너인데 외부에서는 이것을 필요로 하지도 않고 알 필요도 없습니다. 매 프레임마다 어떻게 등록된 리스너들을 다 실행 시켜 주는지 알게 뭡니까? 그냥 쓰면되지. 그리고 이 onEnterFrame()같은 경우는 외부에서 알면 안됩니다. 외부에서 강제로 onEnterFrame을 호출해서 임의로 리스너들을 실행 시키는 경우는 원하지 않기 때문이지요.

※여기서 말하는 외부는 클래스의 객체를 생성해서 쓰는 곳을 말합니다.
var centrelEnterFrame:CentralEnterFrame = new CentralEnterFrame();(사실 이 클래스는 싱글턴이라서 이렇게 객체를 생성하지는 않지만.... var centralEnterFrame:CentralEnterFrame = CentralEnterFrame.obj; 이렇게 하죠.)
centralEnterFrame.addListener(function () { trace("htht"); });
좀 도움이 되셨을라나요?
Posted by wrnly
프로그램/java&eclipse2014. 3. 23. 21:03

물론 jar를 압축푸실 수 있습니다...

 

그리고 압축을 푸시면 위에서 말씀하신 경로에 DEROutputStream 클래스가 존재합니다

 

하지만 질문자님께서 쓰신데로 DEROutputStream 클래스가 존재합니다.

 

자바 파일이 아닌 클래스 파일이 jar 파일 안에 존재하는 겁니다.

 

클래스 파일이란 건 자바 파일이 컴파일 된 파일입니다.

 

xxx.java  ->  xxx.class

 

이렇게 변환이 된건죠.. 즉 java 파일은 없습니다.

 

그런데 압축을 풀어 이 클래스 파일을 메모장이나 다른 에디터로 열면

 

소스 내용을 볼 수가 없습니다.

 

확장자가 바뀌면서 그 내용을 알 수 없게 된다는 의미입니다.

 

이렇게 jar 파일로 자신이 만든 자바 파일을 배포하면 java 파일을 클래스 파일로 바뀌면서

 

다른 사람이 제가 만든 소스의 내용을 볼 수 없게 되죠...

 

뭐 자신의 소스를 남들이 봐도 괜찮다면 그냥 자바 파일을 배포해도 되지만

 

그렇지 않다면 jar 파일로 만들어 배포하는게 좋겠죠 ㅎㅎㅎ

 

이 jar 파일은 이클립스에서 만들 수도 있고

 

알집같은 압축 툴로도 만들 수 있습니다~


-----------------------------


error : 기본 manifest 속성이 없습니다.

 

 

올바르지않은 예)

manifest.txt 저장하실때 위와같이 하시면 

기본 manifest 속성이 없습니다 에러가납니다.

 

 

 

 

 

올바른 예)

manifest.txt 저장하실때 위와같이 한칸 Enter 치시면

기본 manifest 속성이 없습니다 에러가 풀립니다.

 

 

 


Posted by wrnly
프로그램/java&eclipse2014. 3. 23. 21:02

 

복사 http://blog.naver.com/ksh81850/220003557425


 

● InetAddress 클래스

- IP 주소 처리할때 사용하는 클래스.

- 자신의 IP 주소 확인하기 위해서는 시작 -> 실행 -> cmd -> ipconfig -all 을 통해 확인 가능.

 

● InetAddress 클래스 메서드의 구성

- Boolean equals(InetAddress other)

- other 객체와 같은 주소를 갖으면 true, 그렇지 않으면 false

- byte[] getAddress()

- 주소를 갖고 있는 4개 요소의 바이트 배열 return

- String getHostAddress()

- 주소 정보를 나타내는 문자열 return

- String getHostName()

- 자신의 컴퓨터 이름 return

- InetAddress getLocalHost()

- 자신의 컴퓨터 InetAddress 객체 return

- InetAddress getByName(String host)

- host로 지정된 컴퓨터를 나타내는 InetAddress 객체 return

- InetAddress[] getAllByName(String host)

- host로 지정된 모든 컴퓨터 InetAddress 객체로 반환(하나 도메인으로 여러 컴퓨터 작동시)

 

● InetAddress 클래스 특징

- 생성자를 이용한 객체 생성 불가(일반적인 방법으로)

- 생성위해 get메서드를 통해 도메인네임과 ip주소를 이용하여 생성해야 한다.

ex)

InetAddress inet = InetAddress.getByName("?Naver.com");

InetAddress inet = InetAddress.getByName("?125.209.222.141");?

// 해당 IP주소는 Naver.com입니다.?

- 동일한 정보를 입력해야 한다.?

?

● InetAddress 클래스의 메서드를 통한 간단한 예제 1.

- 특정 도메인 네임과 IP 주소 정보를 출력하는 예제?

import java.net.*;?

?public static void main(String[] args) throws UnknownHostException{
      InetAddress fir_add1 = InetAddress.getByName("naver.com");
      InetAddress sec_add2 = InetAddress.getByName("125.209.222.141");
      InetAddress my_add = InetAddress.getLocalHost();
  
      System.out.println("first_address = "+fir_add1.getHostAddress());
      System.out.println("second_address = "+sec_add2.getHostName());
      System.out.println("my_address = "+my_add.getHostAddress());
      System.out.println("my_name = "+my_add.getHostName());
 }

- 네트워크에 관련된 것을 접근하기 위해선 java.net.* 반드시 import 해야 한다.

- ?throws UnknownHostException 을 해주는 이유는 InetAddress 클래스의 객체 생성시 잘못된 도메인 네임과 IP주소를 사용할 경우 UnknownHostException 에러 발생하기 때문에 throws를 통해 예외처리를 시킨 것이다.

- "도메인 네임"을 입력하여 객체 생성시킬수 있다.

- "IP 주소"를 입력하여 객체 생성 시킬수 있다.?

?- 객체 생성 된 것의 IP주소를 출력

- 해당 결과

 

● InetAddress 클래스의 메서드를 통한 간단한 예제 2.

웹 사이트 도메인 네임 입력(사용자)하여 해당 IP 주소 출력하는 예제?

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.*;?

public static void main(String[] args) throws Exception{
      String url = null;
      BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
      System.out.println("Input the Web site : ");
      url = reader.readLine();
      InetAddress web_addr = InetAddress.getByName(url);
      System.out.println(url+"_ip_address = "+web_addr.getHostAddress());
 }?

- ?throws UnknownHostException 을 할 경우는 InetAddress 클래스의 객체 생성시 잘못된 도메인 네임과 IP주소를 사용할 경우의 UnknownHostException 에러 발생은 예외처리가 정상적으로 되지만, readLine에 해당하는 예외처리가 불가능 하므로 둘다 예외처리 가능한 Exception으로 한 것이다.?

?- 객체 생성 된 것의 IP주소를 출력

- 결과 화면

 

● InetAddress 클래스의 메서드를 통한 간단한 예제 3.

?하나의 도메인 이름으로 설정된 모든 컴퓨터의 IP 주소 확인하는 예제

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.*;?

?public static void main(String[] args) throws Exception {
      String url = null;
      BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
      System.out.println("Input the Web site : ");
      url = reader.readLine();
      InetAddress [] web_addr = InetAddress.getAllByName(url);
      System.out.println(url+" : "+web_addr.length + "개의 IP 주소가 존재");
      for(int i=0;i<web_addr.length;i++){
            System.out.println((i+1)+"번 ip주소 : "+web_addr[i].getHostAddress());
      }
 }

?- ?throws UnknownHostException 을 할 경우는 InetAddress 클래스의 객체 생성시 잘못된 도메인 네임과 IP주소를 사용할 경우의 UnknownHostException 에러 발생은 예외처리가 정상적으로 되지만, readLine에 해당하는 예외처리가 불가능 하므로둘다 예외처리 가능한 Exception으로 한 것이다.?

?- 여러개의 이름을 저장하기 위해 배열로 선언했고, AllByName을 이용했다.

배열의 개수를 확인

?- 해당 배열 객체 생성 된 것의 IP주소를 출력?

?- 결과 화면

? 

Posted by wrnly
프로그램/java&eclipse2014. 3. 23. 20:50

 

복사 http://blog.naver.com/ksh81850/220004196289


 

● URL(Uniform Resource Locator)

- URL은 도메인 네임을 사용해 컴퓨터에 있는 문서로 접근할때 사용하는 것

- 도메인 네임이란 인터넷을 쉽게 사용할수 있도록 IP번호에 이름 부여한 것.

- 인터넷에 있는 정보의 위치를 표기하기 위한 표준적 방법

 

● URL의 사용 형식

- URL의 형식에는 프로토콜, 인터넷 주소, 포트 번호, 파일 경로 등이 사용된다. 

- 프로토콜://인터넷 주소[:포트번호][/디렉토리 이름[/파일 이름]]

 

● URL의 기본 특징

- 프로토콜과 인터넷 주소는 대.소문자 구별하지 않는다

- 디렉토리 이름과 파일 이름은 대.소문자 구별한다

- URL 사용 형식에서 대괄호([]) 부분은 생략 가능

- 포트번호 생략시(Well-known port) 번호 사용

- 파일 경로 생략시 기본 파일인 index.html 파일 요청

 

● URL의 사용 예시

- 웹

프로토콜 : http

기본 포트번호 : 80

http://www.naver.com

- Telnet 

프로토콜 : telnet

기본 포트번호 : 23

telnet://chollian.net

- FTP

프로토콜 : ftp

기본 포트번호 : 21

ftp://ftp.netscape.com

- Gopher

프로토콜 : gopher

기본 포트번호 : 70

gopher://gopher.kornet.net

 

● URL 클래스

Java내 URL 처리하고 싶을때 URL 클래스를 사용한다.

 

● URL 클래스의 생성자의 구성

- URL(String protocol, String host, int port, String file)

- URL(String protocol, String host, String file) 

- URL(String urlString)

▶ protocol : 프로토콜(ex: http://)

▶ host : 컴퓨터 이름(ex: www.naver.com) 

▶ port : 포트 번호(ex: 80) 

▶ file : URL에 존재하는 파일 이름

▶ urlString ; 모든 요소를 모팜한 문자열

 

● URL 클래스의 메서드의 구성

- String getFile()

- URL 파일 이름 return

- String getHost()

- URL 호스트 이름 return

- String getPort()

- URL 포트 이름 return

- String getProtocol()

- URL 프로토콜 이름 return

- String toExternalForm()

- 전체 URL 문자열 return

- URLConnection openConnection()

- URL 연결 후, URLConnection 객체 return

- InputStream openStream()

- URL 정보 읽기 위한 InputStream 객체 return 

  URL에 자세한 정보는 URLConnection 클래스 사용하면 된다.

- 사용시, URL 지정된 페이지의 내용을 자신의 컴퓨터에 저장 가능.


● URLConnection클래스의 메서드의 구성

- int getContentLength()

- 문서 길이 return

- String getContentType()

- 문서 타입 return

- long getDate()

- 문서 생성일 return

- long getExpiration()

- 문서 제거일 return

- long getLastModified()

- 문서 마지막 수정 날짜 return

- InputStream getInputStream()

- 문서 읽기 위한 InputStream 객체 return

 

● URL 클래스의 메서드를 통한 간단한 예제 1.

URL 정보 분석하는 예제

import java.io.*;
import java.net.*; 

public static void main(String[] args) throws Exception{
        String url_str = null;
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.print("URL page 입력 >> ");
        url_str = br.readLine().trim();
        System.out.println(url_str);
        URL url = new URL(url_str);
        System.out.println("프로토콜 : "+url.getProtocol());
        System.out.println("포트번호 : "+url.getPort());
        System.out.println("호스트      : "+url.getHost());
        System.out.println("URL 내용 : "+url.getContent());
        System.out.println("파일경로 : "+url.getFile());
        System.out.println("URL 전체 : "+url.toExternalForm());
}

- 사용자로부터 URL 정보를 입력받는다.(문자열의 좌우 여백 공간 제거(trim으로 인해)

- ex)   String temp = "       trim   ";

String temp_trim = temp.trim();

name_trim의 저장된 내용은 "trim" 이 저장된다

URL(String urlString) 생성자를 이용하여 URL 객체를 생성한다.

- 결과화면

 

 

● URLConnection 클래스의 메서드를 통한 간단한 예제 1.

웹 사이트 문서를 컴퓨터로 가지고오는(문서 정보 출력) 예제

public static void main(String[] args) throws Exception {
        String url_string = null;
        int size = 0;
        int ch;
        URL url = null;

        URLConnection url_read=null;
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Input the Web site : ");
        url_string = reader.readLine().trim();
        url = new URL(url_string);
        url_read = url.openConnection();
        size = url_read.getContentLength();
        System.out.println("문서 타입 : "+url_read.getContentType());
        System.out.println("수정 일자 : "+url_read.getLastModified());
        System.out.println("문서 크기 : "+size+"byte");
        if(size > 0){
            InputStream is = url_read.getInputStream();
            while((ch=is.read())!=-1){
                System.out.print((char)ch+" ");
            }
            is.close();
        }
    }

- reader.readLine().trim()은 해당 입력 문자열의 좌우 공백을 없애주고 나머지를 반환한다는 뜻이다.

- 간단한 예제를 보자

String url_string = null;
    
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Input char : ");
        url_string = reader.readLine().trim();
        System.out.println(url_string);

- 결과화면

- 입력은 문자열 맨앞 맨뒤 공백이 존재. 출력은 공백 제거

- getContentLength()는 URLConnection 메서드로서, 전체크기 return

Byte 단위

- InputStream is = url_read.getInputStream() 는 is 객체를 url_read의 메서드를 통해 지정하여 url_read의 데이터값을 읽어오는 역할을 한다.

- url = new URL(url_string)는  URL(String urlString)의 생성자를 바탕으로 url_string이 올바르지 않다면 에러가 발생한다. 그로인해 예외처리를 해줘야 하는데 throws Exception 통해 예외처리를 한다는 것을 알수 있다.

- 결과화면


 

● URLConnection 클래스의 메서드를 통한 간단한 예제 2.

위의 예제 속도를 개선 하는 예제

- 위의 예제는 속도가 느릴수 밖에 없다. 이유는 InputStream의 read() 메서드를 통해 한글자씩 읽어와 출력하기때문이다. 개선해보자.


InputStream is = url_read.getInputStream();

BufferedReader br = new BufferedReader(new InputStreamReader(is);

String temp = null;

while((temp=br.readLine())!=null){
                System.out.print(temp+" ");
}
br.close()?;


- 위의 동일한 코드에서 해당하는 부분만 일부 수정한 부분이다.

- BufferedReader를 통해 한글자씩 읽고 출력하는 것이 아닌 한 라인을 읽고 출력하는 것으로 바꾼것을 알수 있다.

- br.close() -> InputStream 을 닫아주는 것이 아닌 BufferedReader를 닫아줌으로써 둘다 닫는 역할을 한다.

- 결과 화면은 위와 동일하다.


Posted by wrnly