- [Java 기본] Java Network

Posted by 겨울에
2011. 5. 14. 16:33 scrap/ Java/JSP
출처 : http://cafe.naver.com/litave/405



//===========================================================================//
  본 내용은 2002년 제가 Java 강의를 수강하며 정리 했던 내용을
    기본으로 하여 정리하였습니다.
  - 마침 java 기초를 전파할 기회가 생겨 핑계김에 정리해 가려 합니다.
  작성자 : litwave
//---------------------------------------------------------------------------//

<목차>
1. Network
2. InetAddress
3. Port
4. ServerSocket
5. Port

//---------------------------------------------------------------------------//
1. Network
  - Java.net.* 패키지에 포함되어 있으며, 예외 처리를 항상 해주어야 한다.
  - 하나의 컴퓨터에서 다른 컴퓨터로의 전송을 의미한다.

  1.1 TCP 통신
    - InetAddress  - (IP, 도메인 이름을 기억하는 클래스)
    - Socket       - 타 컴퓨터에 접속하기위한 기본적인 접속 포트
    - ServerSocket - 특정포트를 개설할 수 있다.
    1) 특징 : 
      - 전화를 거는것과 유사

      a) 장점
        - 데이터 전송 시 데이터 전송의 신뢰성이 보장된다.(데이타가 전송되는 것이 바로 확인이 가능하다.)

      b) 단점
        - 부하가 많아 진다. (서로간의 통신이 이루어져야 한다. 접속자가 많으면 접속자 많큼 Thread가 만들어져야 한다.)
        - 서버가 없어지면 더이상 사용이 불가능하다.

  1.2 UDP 통신
    - DatagramPacket
    - DatagramSocket
    - MulticastSocket
    1) 특징
      - 소포를 보낸다고 생각
      a) 장점 : - 부하가 거의 없다. (우편물 받을 통만 만들어 놓으면 됨)

      b) 단점 : - 데이타가 도착하지 않는 경우가 발생할 수도 있다.
                - 예) 문자 메세지 보내는 것과 유사.

  1.3 URL : TCP통신의 일종

  1.4 RMI : 차세대(3세대) 통신법 : 하지만 지금은 너무 많이 사용 중이다.
      - 자바 프로그램 끼리만의 연동

  1.5 CORBA
   - 공통 랭귀지(IDR) 하나로 만들었으므로 모든 언어간의 연동이 가능하다.

  1.6 HTTP Servlet * JSP : 서버적 측면에서만 바라본 네트웍


2. InetAddress
  - new 를 이용해서 객체 생성을 할수 없는 클래스
  - ip와 도메인을 기억할 수 있는 클래스이다.
  - 기본적으로 선언되어야 한다.

  1) 생성을 도와주는 Method :
    - getLocalHost() : IP, 도메인네임(을 알 수있는 메소드이다.)
      - 결과형 리턴 값 : static 이다.
    - getByName("~"); - 특정도메인의 InetAddress를 얻어낼 수 있다.
    - getAllbyName("~"); - 특정도메인의 모든 InetAddress를 얻어 낼 수 있다.
    - getHostAddress()
    - getHostName()
    -Ex0210_01.java 참조..

3. Port
  1) 컴퓨터에서 만들수 있는 가상적인 포트의 갯수
    - TCP 포트 : 65536
    - UDP 포트 : 65536
    예)
      HTTP : 80번 포트
      21 : FTP 포트
      23 : SMTP 포트
      25 : Telnet 포트

  2) 이미 1024번까지는 전 세계적으로 정의되어 있는 포트이다. 
    - Oracle : 1521 포트 사용
    - MS-SQL : 1433 포트 사용
    - 구루구루 : 9090 포트 사용

  3) Port에 대해서
    클라이언트에서 서버와 통신을 할때 우리는 TCP포트를 열어 놓고 관리를 할 것이다.
    데이터는 포트로 보낼수 있는 관이 필요하다.
    서버 측으로는 접속한 클라이언트의 ip주소 및 port정보가 오게 된다.
    서버 측에서는 포트를 개설해야만 클라이언트의 이야기를 들을 수 있다.
    자바에서 ServerSocket 에서 포트를 열려고 할때 이미 사용중인 포트를 사용할려고 하면 IOException 을 발생 시킨다.

4. ServerSocket
  - 해당 컴퓨터의 특정 포트를 개설해 준다.
  1) 생성
    ServerSocket ss = new ServerSocket(특정포트);
    ss.accept();     // 들을려고 준비하는 메소드.. br.readLine()와 유사하게 동작
                     // Socket의 정보를 돌려줌.
    Ex0211_02.java 참조

  2) 메소드 :
    - accept()  : 누군가가 서버에 접속할 때까지 대기 상태로 빠지는 것
      - 누군가 접속시 Socket 을 리턴 시켜준다.
      - 접속한 사람의 정보를 알 수 있다.

    - close()
      - 사용후에 닫아 주어야 한다.
    - Ex0210_02 참조
    - Ex0210_03

5. HTTP
  - 우리가 www.daum.net 로 입력을 하면.. http://www.daum.net:-1 이 적히게 되는데(여기서 -1을 80을 의미한다.)
    index.htm 을 요청하는 문구도 포함되어 있다.

  - GET방식으로 요청을 하겠다. /index.html 형태로 HTTP1.0 버전으로 요청을 하겠다고 하는 것이  우리가 흔히 쓰는 www.daum.net 에 숨어 있다.

  5.1 진행 할 작업.
    대상 서버 daum에 클라이언트로서 특정포트를 이용하여 접속할 때 이루어 지는 과정

    1) 특정 포트를 이용해서 접속(new Socket(ip, 포트))한다.
    2) 서버에 문서 요청(request) : 아래의 형식으로 넘겨줌
      - HTTP Method 요청문서 HTTP버젼
               /index.html   HTTP/1.0\r\n\n 

      \n 여기까지가 내가 할 이야기의 끝임을 아려줌.

    3) HTTP Method에 제공되는 메소드 : 이것들은 해당 서버에서 메소드를 만들어 놓아야만 사용이 가능하다.
        - GET
        - POST
        - OPTION
        - DELETE
        - LINK
        - UNLINK

        - daum은 80번 포트에 GET방식으로 접속을 허가해 놓았다.

    3) 서버에서 클라이언트 특으로  응답(response)이 온다.
      - HTTP버전 처리상태 OK(처리내용)
                 100~500 : 200대가 정상으로 파악하면됨
                 100~199 : 현재 처리중이거나, 더 처리할 것이 남음
                 200~299 : 정상처리 되었다.
                 300~399 : 리다이렉션 되어 있다.(다른 곳으로..)
                 400~499 : 사용자 오류이다.
                 500~599 : 서버측 오류(오동작, 임의로 막아놓음)
        <HEAD의 내용(서버정보)이 들어가고 그다음 HTML문서가 전송된다.

        - Ex0211_02_1.java

//---------------------------------------------------------------------------//
// Ex0210_01.java : InetAddress 사용 예
import java.net.*;

public class Ex0210_01 {
    public static void main(String[] ar) {
        System.out.println("== Local 정보(getLocalHost) == ");
        InetAddress ia = null;
        try {
            ia = InetAddress.getLocalHost();
        } catch (UnknownHostException ee) {}
        System.out.println("ip = " + ia.getHostAddress());  //자신의 IP Address알아오기
        System.out.println("name = " + ia.getHostName());   //도메인 네임 알아오기

        System.out.println("== daum 정보(getByName) == ");
        InetAddress ia2 = null;
        try {
            ia2 = InetAddress.getByName("www.daum.net");
        } catch (UnknownHostException ee) {}
        System.out.println("ip = " + ia2.getHostAddress());  //특정 호스트의 아이피 알아오기
        System.out.println("name = " + ia2.getHostName());   //
        
        //다음사이트에서 사용하는 모든 IP주소 알아오기
        System.out.println("== daum 정보(getAllByName) == ");
        InetAddress[] ia3 = null;
        try {
            ia3 = InetAddress.getAllByName("www.daum.net");
        }   catch (UnknownHostException ee) {}
        for(int i=0; i < ia3.length; i++) {
            System.out.println("ip = " + ia3[i].getHostAddress());
            System.out.println("name = " + ia3[i].getHostName());
        }
    }
}

//---------------------------------------------------------------------------//
// Ex0210_02.java : 현재 열려 있는 포트확인
import java.net.*;
import java.io.*;

public class Ex0210_02 {
    public static void main(String [] ar) {
        //열려있는 TCP포트만 검색 -> 포트 스캔하는 방법
        for(int i = 0; i < 65536; i++) {
            try{
              ServerSocket ss = new ServerSocket(i);
                ss.close();
            }catch(IOException ee) {
              System.out.println(i + "번째 포트가 열려있다.");      
            }
        }
    }
}

//---------------------------------------------------------------------------//
// Ex0210_03.java : 서버 생성
import java.net.*;
import java.io.*;
public class Ex0210_03 {
    public static void main(String[] ar) {
        ServerSocket ss = null;
        try {
            ss = new ServerSocket(2003);
            System.out.println("Server Ready...");
        } catch(IOException ee) {
            System.err.println("서버개설 오류 : " + ee.toString());
            System.exit(0);
        }
        while(true) {
            try {
                Socket s = ss.accept();
                System.out.println("사용자 : " + s.toString());
            } catch(Exception ee) { }
        }
    }
}

// 서버에 소캣으로 접속
import java.net.*;
import java.io.*;
public class Ex0210_04 {
    public static void main(String [] ar) {
        try {
            new Socket("192.168.10.100"2003);
        } catch(IOException ee) { }
    }
}


//---------------------------------------------------------------------------//
// Ex0211_02_1.java : daum에서 html 정보 얻어오기
import java.io.*;       //서버와 이야기 하기위해 필요
import java.net.*;

public class Ex0211_02_1 {
    public static void main(String [] ar) throws Exception {
        InetAddress ia = InetAddress.getByName("www.daum.net");      // 다음(해당) 사이트 IP 얻어내기
        Socket sk = new Socket(ia.getHostAddress(), 80);  // 다음사이트에 연결시키기
        // 여기까지 하면 통로가 하나 생긴 것임
        // 파일에 하나를 쓰려하면 Output가 필요하다.
        OutputStream os = sk.getOutputStream();  //보낼 때는 소캣으로 쓰면 된다.
        BufferedReader br = new BufferedReader
                            new InputStreamReader(sk.getInputStream()));          //소켓을 통해서 읽어 들이면 된다.
        
        //두번째 작업 시작
        String str = "GET http://www.daum.net/index.html HTTP/1.0\r\n\n";
        os.write(str.getBytes());     //os라는 스트림을 통해서 다음에게 이야기 한다.
        os.flush();
        
        //서버에서 이제 응답을 하기 시작 할 것이다.
        //우리는 그것을 담아 놓기만 하면 된다.
        while(true) {
            String imsi = br.readLine();
            if(imsi == null) {
                break;
            }
            System.out.println(imsi);
        }
        br.close();
        os.close();
    }
}


//---------------------------------------------------------------------------//
// 첨부 파일 
- Ho0210_01.java : 포트 찾는 프로그램 Swing으로 구성
- Ho0211_01.java : 특정 URL 정보 얻어오는 프로그램

- Ho0212.zip : 수업시간에 만든 채팅 프로그램

//===========================================================================//