InetAddress.getLocalHost () ném UnknownHostException


87

Tôi đang thử nghiệm ứng dụng máy chủ của chúng tôi (viết Java) trên các hệ điều hành khác nhau và nghĩ rằng OpenSolaris (2008.11) sẽ ít rắc rối nhất do tích hợp Java tốt. Hóa ra tôi đã sai, vì tôi kết thúc với một ngoại lệ không xác định

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

Đầu ra là:

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

Tuy nhiên, nslookup desvearth01trả về địa chỉ IP chính xác và nslookup localhosttrả về 127.0.0.1như mong đợi. Ngoài ra, mã tương tự hoạt động hoàn hảo trên FreeBSD. Có điều gì đặc biệt với OpenSolaris mà tôi không biết không?

Bất kỳ gợi ý nào được đánh giá cao, cảm ơn.

Câu trả lời:


119

Theo truyền thống tốt, tôi có thể trả lời câu hỏi của chính mình một lần nữa:

Có vẻ như InetAddress.getLocalHost()bỏ qua /etc/resolv.conf, nhưng chỉ xem /etc/hoststệp (nơi tôi đã không chỉ định bất cứ điều gì ngoài localhost). Thêm IP và tên máy chủ vào tệp này sẽ giải quyết được sự cố và ngoại lệ không còn nữa.


Một câu trả lời khác gần như đúng và tôi đã nhận được gợi ý từ trên và vấn đề của tôi đã được giải quyết ... Cảm ơn.

Nhưng để cải thiện điều này, tôi đang thêm các thay đổi theo từng bước để nó sẽ hữu ích cho cả những người dùng ngây thơ.

Các bước:

  • Mở /etc/hosts, các mục có thể trông giống như bên dưới.

     127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4  
     ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    
  • Bạn cần thêm một dòng nữa phía trên bằng bất kỳ trình soạn thảo nào như vihoặc gedit(ví dụ <your-machine-ip> <your-machine-name> localhost).

     192.168.1.73 my_foo localhost
    

Bây giờ, tệp tổng thể có thể trông như thế này:

192.168.1.73 my_foo localhost
127.0.0.1    localhost localhost.localdomain localhost4 localhost4.localdomain4
::1          localhost localhost.localdomain localhost6 localhost6.localdomain6
  • Chỉ cần lưu nó và chạy lại mã Java của bạn ... công việc của bạn đã xong.

1
Nếu bạn gặp sự cố về quyền khi cố gắng ghi vào tệp máy chủ, hướng dẫn ở đây sẽ hữu ích: decoding.wordpress.com/2009/04/06/…
septerr

3
Ngoài ra còn có một lỗi trong OS X và java 7, chi tiết và workaround đây groups.google.com/forum/#!topic/h2-database/DuIlTLN5KOo
Đánh dấu Lakewood

12
Setting 127.0.0.1 localhost <hostname>là đủ đối với tôi
Marius Soutier

Tìm thấy điều này quá muộn. Thay vào đó, hãy mã hóa giải pháp NetworkInterface.getNetworkInterfaces ().
ctpenrose

4
Để lấy tên máy chủ của bạn, bạn có thể sử dụng hostnamelệnh từ thiết bị đầu cuối.
Xám

8

Tôi sử dụng NetworkInterface.getNetworkInterfaces()như một điểm rơi trở lại khi InetAddress.getLocalHost()ném một UnknownHostException. Đây là mã (không có xử lý ngoại lệ để rõ ràng).

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();
  }
}

Các câu trả lời khác chỉnh sửa /etc/hoststệp. Đây là lỗi dễ xảy ra, dễ hỏng, có thể yêu cầu quyền truy cập root và sẽ không hoạt động trên tất cả các hệ điều hành.


5

Trên phiên bản amazon của tôi, tôi gặp vấn đề tương tự, có vấn đề về cấu hình DNS mặc định. Vì vậy, để khắc phục sự cố, tôi đã thực hiện các bước sau -

lấy tên máy chủ của bạn

$hostname
ip-10-122-16-169

ping đến tên máy chủ

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

tệp cat / etc / hosts , bạn sẽ nhận được một cái gì đó như

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

bây giờ bạn chỉ cần thêm tên máy chủ của bạn vào cuối dòng nắm tay, vì vậy khi bạn nối nó sẽ trông giống như

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

bây giờ bạn đã sẵn sàng, để kiểm tra lại ping cùng một tên máy chủ

$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

Tra cứu máy chủ trên Solaris sử dụng /etc/nsswitch.confvì vậy tùy thuộc vào dòng 'máy chủ:' cho biết nó xác định xem có /etc/hostsnên tham khảo NIS, DNS và / hoặc LDAP hay không.

Nếu bạn chỉ sử dụng máy chủ và DNS, bạn nên có điều này trong /etc/nsswitch.conf:

máy chủ: tệp dns

Lý do nslookup desvearth01hoạt động là vì nslookuplệnh trực tiếp tham khảo ý kiến /etc/resolv.conf. Nếu bạn muốn thực hiện kiểm tra dòng lệnh tốt hơn, hãy sử dụng lệnh:

getent hosts desvearth01

4

Lỗi này xuất hiện khi tôi thay đổi tên máy trạm và thử khởi động Glassfish 2. Bạn cũng phải đổi tên mục nhập tại / etc / hosts, giống như sau:

127.0.0.1       localhost
127.0.1.1       MyNewName


1

Nếu bạn thấy thông báo này, bạn cần đặt tên máy chủ với hostname superhost.domain LỆNH !

Sau đó, hãy kiểm tra xem /etc/hoststệp nào chứa chuỗi như thế này127.0.0.1 localhost .

Ngoài ra, hãy kiểm tra xem lệnh uname -atrả về một cái gì đó như sau:

Linux superhost.domain 2.6.38-8-server # 42-Ubuntu SMP Thứ Hai ngày 11 tháng 4 03:49:04 UTC 2011 x86_64 x86_64 x86_64 GNU / Linux

KHÔNG NHƯ THẾ NÀY !!!!

Linux (không có) 2.6.38-8-server # 42-Ubuntu SMP Thứ Hai ngày 11 tháng 4 03:49:04 UTC 2011 x86_64 x86_64 x86_64 GNU / Linux



0

Tôi cũng đang gặp vấn đề xung quanh vấn đề này. Tôi cần phải kiểm tra thêm, nhưng có vẻ như NetworkInterface.getNetworkInterfaces()có thể đáng tin cậy hơn. Tôi nghĩ rằng điều này không thực hiện việc tra cứu, mà chỉ lấy IP.

Tôi đang sử dụng nó như là 'tốt nhất tiếp theo' khi getLocalHost()thất bại.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.