[개발 지식]/[네트워크]
주소 저장 클래스 (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
반응형