코드 그라데이션

주소 저장 클래스 (1) InetAddress 본문

네트워크

주소 저장 클래스 (1) InetAddress

완벽한 장면 2023. 5. 27. 00:12

InetAddress

  • IP주소(호스트명) 저장 및 관리 클래스
  • port 번호는 관리 못함.
  • 순수하게 IP 정보만 관리한다.

객체 생성 방법

=> static 메서드를 사용하여 객체 생성

 

종류

# getByName(String host)

- 여기도 ip 주소를 저장

- 도메인 DNS에 가서 실제 그 ip 주소를 찾아다가 같이 저장.

 

# getByAddress(byte[] addr)

- 형변환해서 출력해도 마이너스 값이 나옴.

- byte이므로 -128 ~ 127

 

# getByAddress(String host, byte[] addr)

- 여기 host명에 아무 말이나 써도 사실 다 들어간다.

- 그리고 바이트 배열은 DNS 서버까지 가지 않는다.

 

 

getByName(.)으로 생성하는 경우

* InetAdddress는 호스트이름 + IP주소 저장((객체를 만드는 시점에) 실제 해당 호스트 이름이 DNS에 정확히 있어야 

  (없으면 예외 발생))

 

getByAddress(byte[ ])로 생성하는 경우

* IP주소 저장((객체를 만드는 시점에) 실제 정확한 IP인지는 중요하지 않음)

getByAddress(String, byte[ ])로 생성하는 경우:

* 호스트의 이름+ IP주소 저장((객체를 만드는 시점에) 실제 정확한 호스트 이름인지는 중요하지 않음)

 

 

InetAddress 의 주요 메서드

- 리턴 타입 바이트는 가독성 떨어짐

- 루프백이란 보낸 사람에게 다시 돌아오는 것

- timeout 은 그 시간까지만 ping 영역의 응답을 기다리겠다!

 

 

예시

- 다수의 서버를 이용하여 분산처리를 수행하기 때문에 실행 시마다 IP 주소가 다르게 나올 수 있음.

public class _01_InetAddressObjectAndMethod {
	public static void main(String[] args) throws IOException { //JVM은 왜 종료했는지와 함께 프로그램을 종료시켜버림

		// 포트 정보는 미포함.
		//#1. InetAddress 객체 생성
		//@1-1. 원격지IP 객체 생성
		InetAddress ia1 = InetAddress.getByName("www.google.com"); // 호스트명만 줬으므로 실제 DNS서버로 가서 Ip주소 알아내서 같이 저장. 호스트명이 매개변수이므로 이것도 같이 저장
		InetAddress ia2 = InetAddress.getByAddress(new byte[] {(byte)172,(byte)217,(byte)161,36}); //호스트명은 비어서 나오고, 변환된 ip주소만 출력
		InetAddress ia3 = InetAddress.getByAddress("www.google.com", new byte[] {(byte)172,(byte)217,(byte)161,36}); // 두 개 같이 줬으므로, DNS 서버 확인x. 입력한대로 호스트네임 출력하므로 일부러 틀려도 모른다.
		System.out.println("ia1 결과 : "+ ia1);
		System.out.println("ia2 결과 : "+ ia2);
		System.out.println("ia3 결과 : " + ia3);
		System.out.println();
		// ia1과 ia2는 동일한 ip라는 것 잊지 말기
		
		//@1-2. 로컬/로프백IP
		InetAddress ia4 = InetAddress.getLocalHost(); // 현재 실행되고 있는 컴퓨터에 대한 Ip 정보를 가지고 있는 InetAddress가 만들어진다.
		InetAddress ia5 = InetAddress.getLoopbackAddress(); // 루프백 주소는 사용하는 컴퓨터가 무엇이든지 간에 항상 동일하다. 보낸 컴퓨터 주소로 다시 돌아가는 주소를 의미.
		System.out.println("ia4 결과 : " + ia4);
		System.out.println("ia5 결과 : " + ia5);
		System.out.println();
		
		
		//@1-3. 하나의 호스트가 여러 개의 IP를 가지고 있는 경우
		InetAddress[] ia6 = InetAddress.getAllByName("www.naver.com"); // AllByName은 호스트에서 사용하는 모든 ip를 다 가져옴.
		System.out.println("ia6 결과들 : " + Arrays.toString(ia6)); // 배열로 가져온다.
		System.out.println();

실행 결과

 

예시

public class _01_InetAddressObjectAndMethod {
	public static void main(String[] args) throws IOException { //JVM은 왜 종료했는지와 함께 프로그램을 종료시켜버림
    
		//#2. InetAddress 메서드
		byte[] address = ia1.getAddress(); //byte배열로 만들어짐.
		System.out.println(Arrays.toString(address)); // 마이너스로 결과값이 출력...!!!
		System.out.println(ia1.getHostAddress()); // 문자열로 리턴(0-255) 이걸 권장.
		System.out.println(ia1.getHostName()); // 문자열로 리턴
		System.out.println();
		
		System.out.println(ia1.isReachable(1000)); // 1초 기다려서 ping 정보 도달하는지 확인 / true //Exception 처리 필요.
		System.out.println(ia1.isLoopbackAddress()); //127.0.0.1 로 고정되어 있음. / false
		System.out.println(ia1.isMulticastAddress()); //D클래스 주소인가? / false / 멀티캐스트 주소는 224-239.0-255.0-255.0-255

		System.out.println();
		System.out.println("<강제로 true 나오게 변환하기>");
		System.out.println(InetAddress.getByAddress(new byte[] {127,0,0,1}).isLoopbackAddress()); //true
		System.out.println(InetAddress.getByAddress(new byte[] {(byte)234,(byte)234,(byte)234,(byte)234}).isMulticastAddress()); //true
	}
}

 

실행 결과

 

 

728x90
Comments