InetAddress.getLocalHost ()에서 UnknownHostException 발생


88

저는 다른 운영 체제에서 서버 응용 프로그램 (Java로 작성된)을 테스트하고 있으며 멋진 Java 통합으로 인해 OpenSolaris (2008.11)가 가장 문제가 없을 것이라고 생각했습니다. 내가 UnknownHostException으로 끝날 때 내가 틀렸다는 것이 밝혀졌습니다.

try {
  computerName = InetAddress.getLocalHost().getHostName();
  if (computerName.indexOf(".") > -1)
    computerName = computerName.substring(0,
        computerName.indexOf(".")).toUpperCase();
} catch (UnknownHostException e) {
  e.printStackTrace();
}

출력은 다음과 같습니다.

java.net.UnknownHostException: desvearth01: desvearth01
    at java.net.InetAddress.getLocalHost(InetAddress.java:1353)

그러나 nslookup desvearth01올바른 IP 주소를 nslookup localhost반환 127.0.0.1하고 예상대로 반환합니다 . 또한 같은 코드가 FreeBSD에서 완벽하게 작동합니다. 내가 모르는 OpenSolaris에 특별한 것이 있습니까?

어떤 힌트라도 감사합니다.

답변:


120

전통적으로 나는 내 질문에 다시 한번 대답 할 수있다.

InetAddress.getLocalHost()무시하는 것 같지만 파일 /etc/resolv.conf만 봅니다 /etc/hosts(외에 아무것도 지정하지 않은 곳 localhost). 이 파일에 IP와 호스트 이름을 추가하면 문제가 해결되고 예외가 사라집니다.


또 다른 대답은 거의 정확하고 위에서 힌트를 얻었고 문제가 해결되었습니다 ... 감사합니다.

하지만이를 개선하기 위해 단계별 변경 사항을 추가하여 순진한 사용자에게도 도움이 될 것입니다.

단계 :

  • 열면 /etc/hosts항목이 아래와 같이 보일 수 있습니다.

     127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4  
     ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    
  • vi또는 gedit(예 :)와 같은 편집자가이 위에 한 줄을 더 추가해야합니다 <your-machine-ip> <your-machine-name> localhost.

     192.168.1.73 my_foo localhost
    

이제 전체 파일은 다음과 같습니다.

192.168.1.73 my_foo localhost
127.0.0.1    localhost localhost.localdomain localhost4 localhost4.localdomain4
::1          localhost localhost.localdomain localhost6 localhost6.localdomain6
  • 저장하고 Java 코드를 다시 실행하십시오. 작업이 완료되었습니다.

1
호스트 파일에 쓰기를 시도 할 때 권한 문제가 발생하면, 여기에 지침이 도움이 될 것입니다 decoding.wordpress.com/2009/04/06/...
septerr

3
OS X 및 Java 7에도 버그가 있습니다. groups.google.com/forum/#!topic/h2-database/DuIlTLN5KOo
Mark Lakewood

12
설정 127.0.0.1 localhost <hostname>이 충분했습니다
Marius Soutier 2014-09-05

너무 늦게 발견했습니다. 대신 NetworkInterface.getNetworkInterfaces () 솔루션을 코딩했습니다.
ctpenrose 2015 년

4
호스트 이름을 얻으려면 hostname터미널 에서 명령을 사용할 수 있습니다 .
Gray

8

나는 던질 NetworkInterface.getNetworkInterfaces()때 폴백으로 사용 InetAddress.getLocalHost()합니다 UnknownHostException. 다음은 코드입니다 (명확성을 위해 예외 처리 없음).

Enumeration<NetworkInterface> iterNetwork;
Enumeration<InetAddress> iterAddress;
NetworkInterface network;
InetAddress address;

iterNetwork = NetworkInterface.getNetworkInterfaces();

while (iterNetwork.hasMoreElements())
{
   network = iterNetwork.nextElement();

   if (!network.isUp())
      continue;

   if (network.isLoopback())
      continue;

  iterAddress = network.getInetAddresses();

  while (iterAddress.hasMoreElements())
  {
     address = iterAddress.nextElement();

     if (address.isAnyLocalAddress())
        continue;

     if (address.isLoopbackAddress())
        continue;

     if (address.isMulticastAddress())
        continue;

     return address.getHostAddress();
  }
}

다른 답변은 /etc/hosts파일을 편집 합니다. 이것은 오류가 발생하기 쉽고 부서지기 쉬우 며 루트 액세스가 필요할 수 있으며 모든 OS에서 작동하지 않습니다.


5

Amazon 인스턴스에서 동일한 문제가 발생했는데 기본 DNS 구성 문제가있었습니다. 따라서 문제를 해결하기 위해 다음 단계를 수행했습니다.

호스트 이름을 얻으십시오

$hostname
ip-10-122-16-169

호스트 이름으로 핑

$ping ip-10-122-16-169
ping: unknown host ip-10-122-16-169

cat / etc / hosts 파일, 당신은 다음과 같은 것을 얻을 것입니다

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost6 localhost6.localdomain6

이제 첫 번째 줄 끝에 호스트 이름을 추가해야하므로 추가하면 다음과 같이 보일 것입니다.

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 ip-10-122-16-169
::1         localhost6 localhost6.localdomain6

이제 동일한 호스트 이름에 대해 ping을 다시 확인할 준비가되었습니다.

$ping ip-10-122-16-169
PING localhost (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=255 time=0.018 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=255 time=0.024 ms

4

Solaris에서 호스트 조회 /etc/nsswitch.conf는 'hosts :'행이 /etc/hosts, NIS, DNS 및 / 또는 LDAP를 참조해야하는지 결정하는 내용에 따라 사용 합니다 .

호스트와 DNS 만 사용하는 경우 다음 위치에 있어야합니다 /etc/nsswitch.conf.

호스트 : 파일 dns

nslookup desvearth01작동 하는 이유 는 nslookup명령이 직접 참조 하기 때문 /etc/resolv.conf입니다. 더 나은 명령 줄 테스트를 수행하려면 다음 명령을 사용하십시오.

getent 호스트 desvearth01

4

이 오류는 워크 스테이션 이름을 변경하고 Glassfish 2를 시작하려고 할 때 나타납니다. 또한 다음과 같이 / etc / hosts에서 항목의 이름을 변경해야합니다.

127.0.0.1       localhost
127.0.1.1       MyNewName

2

/ etc / hostname 을 체크 아웃 한 다음 호스트 이름을 호스트 파일에 넣습니다.


1

이 메시지가 표시되면이 설정 호스트 이름 필요한 것보다 함께 hostname superhost.domain 명령을 !

그런 다음, 어떤 /etc/hosts파일에 이와 같은 문자열 이 있는지 확인하십시오 127.0.0.1 localhost.

또한 명령 uname -a이 다음과 같은 것을 반환 하는지 확인하십시오 .

리눅스 superhost.domain 2.6.38-8 서버 # 42 우분투 SMP 월 4월 11일 세계 협정시 03시 49분 4초 2011 x86_64에 x86_64의 x86_64에 GNU / 리눅스

이건 아니야!!!!

Linux (없음) 2.6.38-8-server # 42-Ubuntu SMP Mon Apr 11 03:49:04 UTC 2011 x86_64 x86_64 x86_64 GNU / Linux



0

이것도 문제가 있습니다. 추가 테스트가 필요하지만 NetworkInterface.getNetworkInterfaces()더 신뢰할 수있는 것 같습니다 . 나는 이것이 조회를하지 않고 IP를 잡는 것이라고 생각합니다.

getLocalHost()실패하면 '차세대'로 사용하고 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.