6-1. 네트워킹_IP, Port, InetAdress, URI, URL, URL Connection

zhyun·2020년 9월 29일
0

HighJava

목록 보기
49/67

.네트워크 기초

  • 네트워크(netWork)는 여러대의 컴퓨터를 통신 회선으로 연결한 것

.서버와 클라이언트

  • 컴퓨터가 인터넷에 연결되어 있다면 실제로 데이터를 주고받는 행위는 프로그램들이 한다
  • 서비스를 제공하는 프로그램을 서버(server)라고 부른다
  • 서비스를 받는 프로그램을 클라이언트(client)라고 부른다
  • 클라이언트는 서버에 연결요청, 처리요청 -> 서버 : 연결수락, 처리
  • 서버는 클라이언트에게 응답(처리 결과)

.IP

  • 인터넷주소라 불리는 유일한 32비트 숫자로 구성된 주소체계
  • 컴퓨터에 존재하는 고유한 주소 Internet Protocol
  • xxx.xxx.xxx.xxx와 같은 형식으로 표현 (0~255사이의 정수)
  • 프로그램은 DNS(Domain Name System)을 이용해서 연결할 컴퓨터의 IP 주소를 찾는다
  • 대중에게 서비스 제공 -> 대부분 서버는 도메인 이름을 가지고 있는데 DNS에 도메인 이름으로 IP를 등록해 놓는다
    • (ex) 도메인 이름(www.naver.com) : 등록된 IP주소(222.122.195.5)
  • 인터넷 서비스광고를 보면 서버컴퓨터의 IP 대신, 도메인 이름을 홍보한다 (기억하기 쉽기 때문에)

.Port

  • IP는 컴퓨터의 네트워크 어댑터까지만 갈 수 있는 정보이기 때문에 컴퓨터 내에서 실행하는
    서버를 선택하기 위해서 추가적인 정보가 필요 -> 이것이 바로 Port
  • 서버는 시작할때 고정적인 포트 번호를 가지고 실행 -> 포트 바인딩 (binding)
  • 기본적으로 웹 서버80번과 바인딩, FTP 서버21번과 바인딩
  • 클라이언트서버에서 보낸 정보를 받기 위해 포트번호 필요
    • 서버와 같이 고정적인 포트번호가 아니라 운영체제가 자동으로 부여하는 동적 포트 번호를 사용
  • 포트 번호의 범위 : 0~65535
구분명범위설명
Well Know Port Numbers0~1023국제인터넷 주소관리기구(ICANN)가 특정 애플리케이션용으로미리 예약한 포트
Registered Port Numbers1024~49151회사에서 등록해서 사용할 수 있는 포트
Dynamic Or Private Port Numbers49152~65535운영체제가 부여하는 동적 포트 또는 개인적인 목적으로 사용할 수 있는 포트

.InetAddress 클래스

  • 자바에서 IP주소를 표현할때 사용하는 클래스 : java.net.InetAddress객체로 표현
  • 로컬 컴퓨터의 IP주소뿐 아니라 도메인 이름을 DNS에서 검색한 후 IP주소를 가져오는 기능을 제공
  • IP번호와 URL주소를 알아내고 싶을때 사용
  • cmd창 -> ipconfig입력하면 IP번호 확인 가능

InetAddress 클래스의 주요 메서드

getLocalHost()

  • 로컬컴퓨터의 InetAddress를 얻고 싶다면!!
InetAddress local = InetAddress.getLocalHost();
		System.out.println("내 컴퓨터의 Host Name : "+ local.getHostName());
		System.out.println("내 컴퓨터의 IP 주소 : "+local.getHostAddress());

getByName() & getAllByName()

  • 외부 컴퓨터의 도메인 이름을 알고 있다면 InetAddress객체를 얻으면 된다.
InetAdress ia = InetAdress.getByName(String Host);
InetAdress[] iaArr = InetAddress.getAllByName(String Host);

getHostAddress()

  • InetAddress객체에서 IP주소를 얻기 위해서 getHostAddress() 호출
  • 리턴값은 문자열로된 IP주소
    String ip = InetAddress.getHostAddress();

InetAddress 예시

6.JavaNetworkTest
T01_InetAddressTest

  • InetAddress 객체생성
    => new 따로 안만들고 static메서드 사용
public class T01_InetAddressTest {
	public static void main(String[] args) throws IOException {
		//InetAddress클래스 => IP주소를 다루기 위한 클래스
		//naver사이트의 ip정보 가져오기
		InetAddress naverIp = InetAddress.getByName("www.naver.com"); // 네이버 => 도메인 주소
		//호스트 이름은 머신이름, 도메인명, 또는 ip주소 문자열.
		System.out.println("Host Name => "+ naverIp.getHostName());
				 // IP주소에 해당한 호스트 네임을 포함한 String을 반환
		System.out.println("Host Address => "+naverIp.getHostAddress());
				//getHostAddress() => IP주소를 마침표로 구분된 네자리 형식	
		System.out.println();
		
		//자기 자신 컴퓨터의 IP주소 가져오기
		InetAddress localIp = InetAddress.getLocalHost();//로컬
		System.out.println("내 컴퓨터의 Host Name => "+localIp.getHostName());//머신이름
		System.out.println("내 컴퓨터의 Host Address => "+localIp.getHostAddress());
		System.out.println();
		
		//ip주소가 여러개인 호스트의 정보 가져오기
		InetAddress[] naverIps = InetAddress.getAllByName("www.naver.com");//모든 ip주소
		for(InetAddress nIp : naverIps) {
			System.out.println(nIp.toString());
		}
		
	}
}

URL vs URI

URI

  • Uniform Resource Identifier
  • 통합 자원 식별자
  • 인터넷에 있는 자원을 나타내는 유일한 주소
  • URI의 존재는 인터넷에서 요구되는 기본조건으로서, 인터넷 프로토콜이 항상 붙어다님
  • URI의 하위개념에 URL, URN이 포함되어 있다.

URL

  • Uniform Resource Locater
  • <protocol> : //<host>:<port>/<path>?<query>#<reference>
    • http://www.dum.net:80/member/mem.jsp?name=sung#content
  • 인터넷에서 접근 가능자원(Resource)의 주소를 표현할 수 있는 형식
  • URL을 추상화 하여 만든 클래스
  • 웹 상에 서비스를 제공하는 각 서버들에 있는 파일의 위치를 표시하기 위한 것

예제 6.JavaNetworkTest / T02_UrlTest

public class T02_UrlTest {
	public static void main(String[] args) throws MalformedURLException, URISyntaxException {
		//URL 클래스 => 인터넷에서 존재하는 서버들의 자원에 접근할 수 있는 주소를 관리하는 클래스
		//http://ddit.or.kr:80/index.html?ttt=123
		URL url = new URL("http", "ddit.or.kr", 80, "main/index.html?ttt=123&name=bb#kkk");
		
		System.out.println("전체 URL 주소 : http://ddit.or.kr:80/main/index.html?ttt=123&name=bb#kkk");
		
		System.out.println("protocol : "+ url.getProtocol()); //http
		System.out.println("host : "+ url.getHost()); //ddit.or.kr
		System.out.println("port: "+ url.getPort()); // 80
		System.out.println("file : "+ url.getFile()); //쿼리 정보 포함 (port뒤부터 #앞까지)
		System.out.println("query : "+ url.getQuery()); //쿼리 (질의) (?물음표 뒤 ~ #<reference>앞까지)
		System.out.println("path : "+ url.getPath()); //쿼리 정보 미포함 (물음표 앞까지)
		System.out.println("ref: "+ url.getRef()); // 참조 #(샾) 뒷부분
		
		System.out.println(url.toExternalForm());
		System.out.println(url.toString());
		System.out.println(url.toURI().toString());
		
		//URI 예제
		/**
		 * http://java.sun.com/j2se/1.3/
		 * docs/guide/collections/designfaq.html#28
		 * ../../../demo/ifc/src/hello.java
		 * file:///~/calendar
		 * mailto:java-net@abc.com
		 */
	}
}

URL Connection

URLConnection

  • 원격자원에 접근하는데 필요한 정보를 갖는다.
  • 원격서버의 헤더 정보, 해당 자원의 길이와 타입정보, 언어등을 얻어올 수 있다.
  • 추상화 클래스이므로 URL클래스의 openConnection()메소드 이용 객체 생성

예제 6.JavaNetworkTest / T03_URLConnectionTest

  • Url 객체 'url'을 참조하여 openConnection()메소드 이용 => URLConnection의 객체 'urlCon' 생성
  • (추상클래스) URLConnection의 객체 'urlCon'을 참조하여 getContentType(), getContentEncoding(), getContent() 사용
  • Map이용 'urlCon'에 getHeaderFields() 사용 헤더정보 출력
    • Map KeySet에 순서가 없으니까 Iterator 사용
  • 해당 호스트 페이지 내용 가져오기
    • InputStream, InputStreamer
    • URLConnection의 getInputStream()메서드 이용
    • URL객체의 openStream()메서드 이용
public class T03_URLConnectionTest {
	public static void main(String[] args) throws IOException {
		//URLConnection => 애플리케이션과 URL간의 통신 연결을 위한 추상 클래스
		
		//특정 서버 (예:naver 서버)의 정보와 파일 내용을 출력하는 예제
		URL url = new URL("https://www.naver.com/index.html"); //예외던짐1(url형식에 맞지 않게 써서)
		
		//Header 정보 가져오기
		
		//URLConnection(추상클래스) 객체 구하기 (?상위 하위 다형성?)
		URLConnection urlCon = url.openConnection(); // 예외던짐2 (IO Exception으로 통일댐)
		
		System.out.println("Content-Type : "+ urlCon.getContentType());
		System.out.println("Encoding : "+urlCon.getContentEncoding());
		System.out.println("Content : "+urlCon.getContent());
		System.out.println();
		
		//전체 Header정보 출력하기 => getHeaderFields메소드 이용
		Map<String, List<String>> headerMap = urlCon.getHeaderFields();
		
		//Header의 key값 구하기
		Iterator<String> iterator = headerMap.keySet().iterator(); // keySet에 순서가 없으니까 iterator로 갖고옴
		while(iterator.hasNext()) {
			String key = iterator.next();
			System.out.println(key + " : " + headerMap.get(key)); //header정보
		}
		System.out.println("--------------------------------------------여기까지가 Header정보---------------");
		
		//해당 호스트의 페이지 내용 가져오기
		
		//파일 읽어오기 위한 스트림 객체 생성
		//방법1 => URLConnection의 getInputStream()메서드 이용하기
		//방법2 => URL객체의 openStream()메서드 이용하기
		//InputStream is = url.openConnection().getInputStream(); //방법1
		InputStream is = url.openStream(); //방법2
		InputStreamReader isr = new InputStreamReader(is, "utf-8"); //보조스트림
		
		int c;
		while((c = isr.read())!=-1) {
			System.out.print((char)c);
		}
		
		//스트림 닫기
		isr.close();
		
	}
}
profile
HI :)

0개의 댓글