에몽이

[Java] 네트워크 (Network) - 개요, InetAddress, URL, URLConnection 클래스 [출처] [Java] 네트워크 (Network) - 개요, InetAddress, URL, URLConnection 클래스 본문

java

[Java] 네트워크 (Network) - 개요, InetAddress, URL, URLConnection 클래스 [출처] [Java] 네트워크 (Network) - 개요, InetAddress, URL, URLConnection 클래스

ian_hodge 2017. 7. 4. 13:43


Network이란?

   - 하나의 Device(컴퓨터)로부터 다른 Device로 데이터를 옮기는 것

   - 통신 프로그램을 의미.

    자바 네트웤 프로그램은 타 언어에 비해 편리하다. 프로그램시 개발해야 할 많은 기능들이 이미 Core Api에 구현되어 있기 때문.


 

통신의 3대 요소 

1) 서버

2) 클라이언트

3) Network : 서버와 클라이언트를 연결해주는 근간.

 

 

 

통신 방식

1) TCP 통신 방식

- 양방향 연결 지향성 통신 방식(Connection Oriented방식)

- 신뢰적, (데이터의 전송순서가 보장됨, 데이터의 수신여부를 확인함)

- 전화 통신 방식과 비슷

 

2) UDP  통신 방식

- 비연결 지향성 통신 방식

- 비신뢰적 (데이터의 전송순서가 바뀔수있음, 데이터의 수신여부를 확인안함)

- 우편물 배달방식과 비슷

 

ㄱ) UDP통신 방식은 데이터의 손실이 있을 수 있는 통신방식

ㄴ) 또한 클라이언트와 서버와의 연결이 이뤄지지 않은 상태에서도

     데이터를 보낼 수 있다.

 

 

 

 

[참고] 네트워크 용어

 

네트워크 : 데이터 교환을 목적으로 로컬 컴퓨터와 원격 컴퓨터 간에 데이터의 흐름을 나타내는 구조

 

IP(Internet Protocol)  : 컴퓨터(host,호스트)를 구별하는데 사용되는 고유한 주소값.

IP v4 : 인터넷 주소라 불리는 유일한 32비트 숫자로 구성되 주소체계.  

IP v6 : 기존 IPv4의 32비트 주소길이를 4배 확장한 128비트 주소 길이를 사용. (약 3.4 x 10의 38승(2의128승)개

* IP 프로토콜 : 네트웍에 연결된 각각의 컴퓨터에 IP주소(IP address)를 붙여서 관리하는 규칙

 

 

포트(port) : 네트워크를 통해 데이터를 주고 받을 때 사용되는 가상의 출구 , 즉 프로그램(서비스)에서 사용되는 논리적인 접속 장소

          

     ( 0~ 65535 범위의 정수번호로 식별됨, 0~1023의 시스템이 사용하는 포트번호임 )

     80(HTTP), 21(FTP), 22(SSH), 23(TELNET) 등이 있다. 

 

 

프로토콜 (protocol ) : 클라이언트와 서버간의 통신 규약

 상호간의 접속이나 절단방식, 통신방식, 데이터의 형식, 전송속도 등에 대하여 정하는것.

 

 

TCP/IP (Transmission Control Protocol/Internet Protocol)

인터넷상에서 호스트들을 서로 연결시키는데 사용하는 통신 프로토콜로 기종이 서로 다른 컴퓨터 시스템을 서로 연결해 데이터를 전송하기 위한 통신 프로토콜.

 

UDP(User Datagram Protocol)

IP를 사용하는 네트워크내에서 컴퓨터들 간에 메시지들을 교환할 때 제한된 서비스만을 제공하는 통신 프로토콜.

 

URL(Uniform Resource Locator) : 인터넷상에 있는 각종 정보들의 위치를 나타내는 표준

URI(Uniform Resource Identifier) : 특정 자원에 접근하기 위한 형식이나 고유한 이름으로 URL보다 넒은 의미의 개념.

 

Broadcast : 데이터를 여러방향으로 동시에 전송하여 동일 IP그룹에 있는 컴퓨터라면 데이터를 수신할수있는 방식이다.

Unicast : 특정한 대상 수신자에게만 보내는 방식

Multicast : 다중의 수신 대상자들에 보내는 방식

RMI (Remote Method Invocation)

자바프로그래밍 언어와 개발환경을 사용하여 서로 다른 컴퓨터상에 있는 객체들이 분산 네트워크 내에서 상호 작용하는 객체 지향형 프로그램을 작성할수있도록 해주는 방식이다. RMI는 일반적으로 RPC라고 알려진 것의 자바 버전이다.

 

 

클라이언트 프로그램(client program) : 연결을 요청하는 통신 프로그램

서버 프로그램(server program) : 연결 요청을 기다리는 통신 프로그램

 

 

1. import java.net.* ; 

2. TCP 방식 :  연결지향성 , 신뢰성 높음 , 네트워크 부담크다.

3. UDP 방식 : 비연결지향성 , 신뢰성 낮음, 네트워크 부담 적다.

4. IP방식 : 컴퓨터의 주소(도메인) 

5. Port : 하나의 아이피에서 응용프로그램을 구분해준다.

6. Object- ServerSocket -> 서버 (TCP방식구현)

               Socket -> 클라이어트 (TCP방식 구현)

               DatagramSocket -> 서버 (UDP방식 구현)               

     DatagramPacket -> 클라이언트(UDP방식 구현)

               InetAddress 

               URL/URI




InetAddress
IP주소를 표현하거나 다루기 위한 클래스

 메서드

설명 

 byte[] getAddress()

InetAddress 객체의 실제 IP 주소를 바이트 배열로 반환한다.

 static InetAddress[] getAllByNmae(String host)

도메인명(host)에 지정된 모든 호스트의  InetAddress 객체를 배열에 담아 반환한다. 

 static InetAddress getByAddresss(byte[] addr)

매개변수 addr에 대응되는 InetAddress 객체를 반환한다.

 static InetAddress getByName(String host)

도메인명(host)에 대응되는 InetAddress 객체를 반환한다

 String getCanonicalHostName()

FQDN(fully qualified domain name)을 반환한다. 

 String getHostAddress()

호스트의 IP주소를 반환한다. 

 String getHostName()

호스트의 이름을 반환한다. 

 String toString()

호스트이름과 IP 주소를 스트링 문자열로 오버라이딩 한 메소드

 Static InetAddress getLocalHost()

로컬호스트의 InetAddress 객체를 반환한다.

 boolean isMulticastAddress()

IP주소가 멀티캐스트 주소인지 알려준다. 

 boolean isLoopbackAddress()

IP주소가 loopback주소(127.0.0.1) 인지 알려준다. 

 

 [코드] InetAddress클래스

  1. import java.net.InetAddress;
  2. import java.net.UnknownHostException;
  3. import java.util.Arrays;
  4. import java.util.Scanner;
  5.  
  6.  
  7. public class InetAddressTest {
  8.     public static void main(String[] args) throws UnknownHostException {
  9.         //Scanner reader = new Scanner(System.in);
  10.         //System.out.print("주소입력:");;
  11.         //String target = reader.next();
  12.         String target="www.naver.com";
  13.         InetAddress inet = InetAddress.getByName(target)//도메인명(host)을 통해 IP주소를 얻는다.
  14.        
  15.         System.out.println("getHostAddress() : "+ inet.getHostAddress())//호스트의 IP주소
  16.         System.out.println("getHostName() : "+ inet.getHostName())//호스트의 이름
  17.         System.out.println("toString() : "+ inet.toString());
  18.        
  19.         byte[] ipAddr = inet.getAddress()//ip주소를 byte배열로 반환
  20.         System.out.println("getAddress() : "+Arrays.toString(ipAddr))//byte배열을 출력
  21.        
  22.         String result= "";
  23.         for(int i=0; i< ipAddr.length;i++){
  24.             result += (ipAddr[i]<0)?ipAddr[i]+256 : ipAddr[i];
  25.             if(i!=ipAddr.length-1)result +=".";
  26.         }
  27.         //byte범위는 : -128~127 
  28.        
  29.         System.out.println("getAddress()+256 : "+result);
  30.         System.out.println();
  31.         System.out.println("========= InetAddress.getLocalHost()======");
  32.         inet = InetAddress.getLocalHost()//로컬호스트의 IP주소를 반환
  33.         System.out.println("getHostAddress() : "+ inet.getHostAddress())//호스트의 IP주소
  34.         System.out.println("getHostName() : "+ inet.getHostName())//호스트의 이름
  35.         System.out.println("toString() : "+ inet.toString());
  36.        
  37.         System.out.println();
  38.         System.out.println("========= inet.getAllByName(\"www.naver.com\")======");
  39.        
  40.         InetAddress[] ipAddr2 = inet.getAllByName("www.naver.com")//도메인명(host)에 지정된 모든 호스트의 IP주소를 배열에 담아 반환
  41.        
  42.         for(int i=0; i< ipAddr2.length;i++){
  43.             System.out.println("ipArr2["+i+"] : "+ipAddr2[i]);
  44.         }
  45.    
  46.     }
  47. }
  48.  

 

 

 

 

URL (Uniform Resource Location) 

 

URL 클래스 

URL : 인터넷에서 접근 가능한 자원(Resource)의 주소를 표현할수있는 형식

URL를 추상화하여 만든 클래스

URL 객체를 생성할때 생성자에 지정하는 URL의 형식이 정확하지 않은 경우 java.net.MalformedURLException이 발생

 

 

http://blog.naver.com:80/javaking75/index.html?copen=1#9380390

 

프로토콜 :  자원에 접근하기 위해 서버와 통신하는데 사용되는 통신규약(http)

호스트명 : 자원을 제공하는 서버의 이름(www.naver.com)

포트번호 : 통신에 사용되는 서버의 포트번호(80)

경로명 : 접근하려는 자원이 저장된 서버상의 위치 (/javaking75/)

파일명 : 접근하려는 자원의 이름(index.html)

쿼리(query) : URL에서 '?' 이후의 부분 (copen=1)

참조(anchor) : URL에서 '#'이후의 부분(#9380390)

 

 

 생성자

설명 

 URL(String spec)

지정된 문자열 정보의 URL객체를 생성 

 URL(String protocol, String host, String file)

지정된 값으로 구성된 URL객체를 생성 

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

지정된 값으로 구성된 URL객체를 생성 

 

 

 메서드

설명 

 String getAuthority()

호스트명과 포트를 문자열로 반환한다. 

 Object getContent()

URL의 Content객체를 반환한다. 

 Object getContent(Class[] classes)

URL의 Content객체를 반환한다. 

 int getDefaultPort()

URL의 기본 포트를 반환한다. (http는 80)

 String getFile()

파일명을 반환 ( 경로 + 쿼리 문자열)

 String getHost()

호스트명을 반환

 String getPath()

경로명을 반환

 int getPort()

포트를 반환 (URL이 포트번호를 포함하지 않는 경우는 -1)

 String getProtocol()

프로토콜을 반환

 String getQuery()

쿼리를 반환

 String getRef()

참조(anchor)를 반환

 String getUserInfo()

사용자정보를 반환

 URLConnection openConnection()

URL과 연결된 URLConnection을 얻는다. 

 URLConnection openConnection(Proxy proxy)

URL과 연결된 URLConnection을 얻는다.

 InputStream openStream()

URL과 연결된 URLConection의 InputStream을 얻는다.

 boolean sameFile(URL other)

두 URL이 서로 같은 것인지 알려준다.

 void set(String protocol, String host, int port, String file, String ref)

URL객체의 속성을 지정된 값으로 설정한다. 

 void set(String protocol, String host, int port, String authority, String userinfo, String path, String query, String ref) 

URL객체의 속성을 지정된 값으로 설정한다.

 String toExternalForm()

URL을 문자열로 변환하여 반환한다.

 URI toURI()

URL을 URI로 변환하여 반환한다. 

 

 

 

 

 [코드] URL 클래스 기본 예제

  1. import java.net.*;
  2.  
  3. public class NetworURL2 {
  4.     public static void main(String args[]) throws Exception {
  5.  
  6.         System.out.println("url.getAuthority():"+ url.getAuthority());//호스트명과 포트를 문자열로 얻습니다.
  7.         System.out.println("url.getContent():"+ url.getContent())// URL의 Content객체를 얻습니다.
  8.         System.out.println("url.getDefaultPort():"+ url.getDefaultPort())//URL의 기본 포트
  9.         System.out.println("url.getPort():"+ url.getPort())//포트
  10.         System.out.println("url.getFile():"+ url.getFile())//파일명
  11.         System.out.println("url.getHost():"+ url.getHost())//호스트명
  12.         System.out.println("url.getPath():"+ url.getPath())//경로명
  13.         System.out.println("url.getProtocol():"+ url.getProtocol())//프로토콜 출력
  14.         System.out.println("url.getQuery():"+ url.getQuery())//URL의 쿼리부분을 출력
  15.         System.out.println("url.getRef():"+ url.getRef())// URL의 참조(anchor) 부분 출력
  16.         System.out.println("url.getUserInfo():"+ url.getUserInfo())//사용자 정보
  17.         System.out.println("url.toExternalForm():"+ url.toExternalForm());//URL을 문자열로
  18.         System.out.println("url.toURI():"+ url.toURI())//URL을 URI로 변환
  19.     }
  20. }

[결과보기]

 

url.getAuthority():www.hanb.co.kr:80

url.getContent():sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@1a85d38

url.getDefaultPort():80

url.getPort():80

url.getFile():/book/look.html?isbn=978-89-7914-887-9

url.getHost():www.hanb.co.kr

url.getPath():/book/look.html

url.getProtocol():http

url.getQuery():isbn=978-89-7914-887-9

url.getRef():top

url.getUserInfo():null

url.toExternalForm():http://www.hanb.co.kr:80/book/look.html?isbn=978-89-7914-887-9#top

url.toURI():http://www.hanb.co.kr:80/book/look.html?isbn=978-89-7914-887-9#top 


 

 

 

 [코드] URL 클래스, openStream()메서드를 이용해서 웹문서 읽어오기

  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.io.InputStreamReader;
  5. import java.net.URL;
  6. import java.nio.charset.Charset;
  7.  
  8.  
  9. public class URLTest {
  10.     public static void main(String[] args) throws IOException {
  11.         BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  12.        
  13.         System.out.println("접속할 서버 주소 : ");
  14.         String strUrl = br.readLine();
  15.        
  16.         URL url = new URL(strUrl)//URL객체를 생성
  17.         InputStream is = url.openStream()//서버로부터 데이터를 주고 받을수있게 스트림을 연결.
            //openStream()메소드를 이용하면 URL이 위치한곳과 자동으로 접속이 일어나고, 
            //그 결과로 Inpusstream이 반환된다.
  18.         //br = new BufferedReader(new InputStreamReader(is));
  19.         br = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
  20.        
  21.        
  22.         String data ="";
  23.         while( (data = br.readLine())!=null){
  24.             System.out.println(data);
  25.         }
  26.        
  27.         br.close();
  28.         is.close();
  29.        
  30.     }
  31. }
  32.  

=>

br = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));

 

 

=> 서버에서 데이터를 읽어올시 charset을 지정하지 않았을경우 한글이 깨졌다.

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

 

 


 

 

 

 

 

URLConnection 클래스

 

어플리케이션과 URL간의 통신 연결을 위한 추상클래스

원격자원에 접근하는데 필요한 정보를 갖고 있다.

원격서버의 헤더정보, 해당 자원의 길이와 타입정보, 언어 등을 얻어올수있다.

추상화 클래스이므로 URL클래스의 openConnection() 메서드를 이용하여 객체를 새성합니다.

URLConnection 크래스의 connect()메소드를 호출해야 객체가 완성됨.

API 문서 참고 : http://docs.oracle.com/javase/7/docs/api/java/net/URLConnection.html

 

ex) 

URL url = new URL("http://www.naver.com");

URLConnection urlCon = url.openConnection();

urlCon.connect();

 

 

 생성자

설명 

 URLConnection(URL url)

매개변수 url으로 URLConnection객체를 생성

  

 

 메서드

설명 

void addRequestProperty(String key, String value)

지정된 키와 값을 RequestProperty에 추가한다. 기존에 같은 키가있어도 값을 덮어 쓰지 않는다.

void connect()

URL에 지정된 자원에 대한 통신연결을 연다.

boolean getAllowUserInteraction()

UserInteraction의 허용여부를 반환 

int getConnectTimeout()

연결종료시간을 천분의 일초로 반환한다. 

Object getContent()

content객체를 반환한다. 

Object getContent(Class[] classes)

content객체를 반환한다. 

String getContentEncoding()

content의 인코딩을 반환한다. 

int getContentLength()

content의 크기를 반환한다. 

String getContentType()

content의 type를 반환한다. 

long getDate()

헤더(header)의 date필드의 값을 반환한다. 

boolean getDefaultAllowUserInteraction()

defaultAllowUserInteraction의 값을 반환한다. 

String getDefaultRequestProperty(String key)

RequestProperty에서 지정된 키의 디폴트 값을 얻는다. 

boolean getDefaultUseCaches()

useCache의 디폴트 값을 얻는다. 

boolean getDoInput()

doInput필드값을 얻는다. 

boolean getDoOutput()

doOutput필드값을 얻는다. 

long getExpiration()

자원(URL)의 만료일자를 얻는다(천분의 일초단위) 

FileNameMap getFileNameMap()

FileNameMap(mimetable)을 반환한다. 

String getHeaderField(int n)

헤더의 n번째 필드를 읽어온다. 

String getHeaderField(String name)

헤더에서 지정된 이름의 필드를 읽어온다. 

String getHeaderFieldDate(String name, long Default)

지정된 필드의 값을 날짜값으로 변환하여 반환한다. 필드값이 유효하지 않을 경우 Default값을 반환한다. 

String getHeaderFieldInt(String name, int Default)

지정된 필드의 값을 정수값으로 변환하여 반환한다. 필드값이 유효하지 않을 경우 Default값을 반환한다. 

String getHeaderFieldKey(int n)

헤더의 n번째 필드를 읽어온다. 

Map getHeaderFields()

헤더의 모든 필드와 값이 저장된 Map을 반환한다. 

long getIfModifiedSince()

ifModifiedSince(변경여부)vlfemdml rkqtdmf qksghksgksek. 

InputStream getInputStream()

URLConnection에서 InputStream을 반환한다. 

long getLastModified()

LastModified(최종변경일)필드의 값을 반환한다. 

OutputStream getOutputStream()

URLConnection에서 OutputStream(서버에 전송할 데이터를 쓸 수 있는)을 반환한다.  

 

URLConnection은 기본적으로 출력을 지원하지 않는다.

출력스트림을 요청하기 전에 setDoOutput(true)을 호출해야 한다

Permission getPermission()

Permission(허용권한)을 반환한다. 

int getReadTimeout()

읽기제한시간의 값을 반환한다.(천분의 일초) 

Map getRequestProperties()

Requestproperties에 저장된 (키, 값)을 Map으로 반환한다. 

String getRequestProperty(String key)

RequestProperty에서 지정된 키의 값을 반환한다. 

URL getURL()

URLConnection의 URL을 반환한다. 

boolean getUseCaches()

캐쉬의 사용여부를 반환한다. 

String guessContentTypeFromName(String fname)

지정된 파일(fname)의 content-type을 추측하여 반환

String guessContentTypeFromStream(InputStream is) 

지정된 입력스트림(is)의 content-type을 추측하여 반환

void setAllowUserInteraction(boolean allowuserinteraction)

UserInteraction의 허용여부를 설정한다. 

void setConnectTimeout(int timeout)

연결종료시간을 설정한다. 

void setContentHandlerFactory(ContentHandlerFactory fac)

ContentHandlerFactory를 설정한다. 

void setDefaultAllowUserInteraction(boolean defaultallowuserinteraction)

UserInteraction허용여부의 기본값을 설정한다. 

void setDefaultRequestProperty(String key, String value) 

RequestProperty의 기본 키쌍(key-pair)을 설정한다.

void setDefaultUseCaches(bolean  boolean defaultusecaches)

캐쉬 사용여부의 기본값을 설정 

void setDoInput(boolean doinput)

DoInput필드의 값을 설정한다. 

void setDoOutput(boolean dooutput)

DoOutput필드의 값을 설정한다. 

void setFileNameMap(FileNameMap map)

FileNameMap을 설정한다. 

void setsetIfModifiedSince(long ifmodifiedsince)

ModifiedSince필드의 값을 설정한다. 

void setReadTimeout(int timeout)

읽기제한시간을 설정한다.(천분의 일초) 

void setRequestProperty(String key, String value)

RequestProperty에 (key, value)를 저장한다. 

void setUseCaches(boolean usecaches)

캐쉬의 사용여부를 설정한다. 

 

 

 

 

 

 [코드] URLTest2.java - URLConnection 클래스

  1. import java.io.BufferedInputStream;
  2. import java.io.BufferedOutputStream;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. import java.io.InputStreamReader;
  6. import java.net.MalformedURLException;
  7. import java.net.URL;
  8. import java.net.URLConnection;
  9.  
  10.  
  11. public class URLTest2 {
  12.     public static void main(String[] args)  {
  13.         try {
  14.            
  15.             String urlStr = "http://blogpfthumb.phinf.naver.net/20120327_268" +
  16.             "/javaking75_1332844788418_Mwoj0m_jpg/%B3%D7%C0%D9%C5%AC%B7%CE%B9%F6.jpg";
  17.             URL url = new URL(urlStr);
  18.            
  19.            
  20.             //스트림 얻어서 파일로 저장하자. myimg.jpg
  21.            
  22.             BufferedInputStream bis = new BufferedInputStream(url.openStream());
  23.             FileOutputStream fos = new FileOutputStream("myimg.jpg");
  24.             byte[] buffer = new byte[1024];
  25.            
  26.             int n = 0;
  27.             int count=0;
  28.             URLConnection uc = url.openConnection();
  29.             int fileSize = uc.getContentLength();
  30.             System.out.println("파일크기 : "+fileSize);
  31.             System.out.println("컨텐트타입 : "+uc.getContentType());
  32.             while((n=bis.read(buffer))!=-1){
  33.                 fos.write(buffer,0,n);
  34.                 fos.flush();
  35.                 count+=n;
  36.                 //System.out.println(((count*100)/fileSize)+"% ");
  37.             }
  38.            
  39.             fos.close();
  40.             bis.close();
  41.         } catch (MalformedURLException e) {
  42.             e.printStackTrace();
  43.         } catch (IOException e){
  44.            
  45.         }
  46.        
  47.     }
  48. }
  49.  

 

 


Comments