InetAddress.getLocalHost () अज्ञातHostException को फेंकता है


87

मैं विभिन्न ऑपरेटिंग सिस्टम पर हमारे सर्वर-एप्लिकेशन (लिखित जावा) का परीक्षण कर रहा हूं और सोचा है कि ओपनसोलारिस (2008.11) अच्छा जावा एकीकरण के कारण कम से कम परेशानी होगी। मुझे पता है कि मैं गलत था, के रूप में मैं एक अज्ञातHostException के साथ समाप्त होता है

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 के लिए कुछ खास है जिसकी मुझे जानकारी नहीं है?

किसी भी संकेत की सराहना की, धन्यवाद।

जवाबों:


119

अच्छी परंपरा में, मैं एक बार फिर अपने प्रश्न का उत्तर दे सकता हूं:

ऐसा लगता है कि InetAddress.getLocalHost()अनदेखा करता है /etc/resolv.conf, लेकिन केवल /etc/hostsफ़ाइल को देखता है (जहां मैंने इसके अलावा कुछ भी निर्दिष्ट नहीं किया था localhost)। इस फ़ाइल में IP और hostname जोड़ने से समस्या हल हो जाती है और अपवाद समाप्त हो जाता है।


एक और उत्तर लगभग सही है और मुझे ऊपर से संकेत मिला है और मेरी समस्या हल हो गई है ... धन्यवाद।

लेकिन इसे सुधारने के लिए, मैं चरण-दर-चरण परिवर्तन जोड़ रहा हूं, ताकि यह भोले उपयोगकर्ताओं के लिए भी उपयोगी हो।

कदम:

  • खोलें /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
  • बस इसे सहेजें और फिर से अपना जावा कोड चलाएं ... आपका काम पूरा हो गया है।

1
यदि आप होस्ट फ़ाइल में लिखने का प्रयास करते समय अनुमति संबंधी समस्याओं का सामना करते हैं, तो यहाँ निर्देश मदद करेंगे: decoding.wordpress.com/2009/04/06/…
septerr

3
वहाँ भी ओएस एक्स और जावा 7, विवरण में एक बग है और यहाँ वैकल्पिक हल के groups.google.com/forum/#!topic/h2-database/DuIlTLN5KOo
मार्क Lakewood

12
127.0.0.1 localhost <hostname>मेरे लिए सेटिंग पर्याप्त थी
Marius Soutier

यह बहुत देर से मिला। इसके बजाय NetworkInterface.getNetworkInterfaces () समाधान को कोडित किया गया।
ctpenrose

4
अपना होस्टनाम प्राप्त करने के लिए, आप hostnameटर्मिनल से कमांड का उपयोग कर सकते हैं ।
ग्रे

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

मेरे अमेज़ॅन उदाहरण पर मैं एक ही मुद्दा रहा था, डिफ़ॉल्ट DNS कॉन्फ़िगरेशन समस्या थी। तो मैंने इन चरणों को करने के लिए समस्या को हल करने के लिए -

अपना मेजबान नाम प्राप्त करें

$hostname
ip-10-122-16-169

होस्टनाम के लिए पिंग

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

बिल्ली / आदि / मेजबानों फ़ाइल, आप की तरह कुछ मिल जाएगा

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 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

सोलारिस पर होस्ट लुकअप का उपयोग करता है, /etc/nsswitch.confइसलिए 'होस्ट:' लाइन के आधार पर यह निर्धारित करता है कि यह निर्धारित करता है कि क्या /etc/hosts, एनआईएस, डीएनएस और / या एलडीएपी से परामर्श किया जाना चाहिए।

यदि आप केवल होस्ट और DNS का उपयोग करते हैं, तो आपके पास यह होना चाहिए /etc/nsswitch.conf:

होस्ट: फाइलें डीएनएस

कारण nslookup desvearth01काम करता है क्योंकि nslookupकमांड सीधे व्यंजन है /etc/resolv.conf। यदि आप एक बेहतर कमांड लाइन टेस्ट करना चाहते हैं, तो कमांड का उपयोग करें:

गेटवे होस्ट्स desvearth01

4

यह त्रुटि तब दिखाई देती है जब मैंने वर्कस्टेशन का नाम बदल दिया और ग्लासफिश 2 शुरू करने की कोशिश की। आपको प्रवेश / / मेजबानों पर प्रविष्टि का नाम बदलना होगा, इसके लिए कुछ:

127.0.0.1       localhost
127.0.1.1       MyNewName


1

यदि आप इस संदेश को देखते हैं तो आपको COMMAND के साथ होस्टनाम सेट करने की आवश्यकता है !hostname superhost.domain

इसके बाद चेक करें कि किस /etc/hostsफाइल में इस तरह से स्ट्रिंग है 127.0.0.1 localhost

इसके अलावा, जांच लें कि कमांड uname -aकुछ इस तरह से लौटे:

लिनक्स सुपरहॉस्ट.डोमेन 2.6.38-8- सर्वर # 42-उबटन एसएमपी मोन अप्रैल 11 03:49:04 UTC 2011 x86_64 x86_64 x86_64 GNU / Linux

इस तरह नहीं!!!!

लिनक्स (कोई नहीं) २.६.३----सर्वर # ४२-उबटन एसएमपी मोन अप्रैल ११ 03:49:04 यूटीसी २०११ x86_64 x86_64 x86_64 GNU / Linux


0

एक अन्य विकल्प इस पोस्ट में है (वास्तव में, आपके मेजबान के लिए / etc / sysconfig / नेटवर्क फ़ाइल में क्या है ... इसे एक FQDN नाम में बदलकर इस समस्या को हल करता है)।

जावा getLocalHost () UnknownHostException / etc / मेजबान फ़ाइल linux एपीआई भिन्न है?


0

मैं इस मुद्दे के रूप में अच्छी तरह से कर रहा हूँ। मुझे और परीक्षण करने की आवश्यकता है, लेकिन ऐसा लगता है कि यह NetworkInterface.getNetworkInterfaces()अधिक विश्वसनीय हो सकता है। मुझे लगता है कि यह लुकअप नहीं करता है, लेकिन सिर्फ आईपी को पकड़ लेता है।

मैं इसे 'अगले सबसे अच्छे' के रूप में उपयोग कर रहा हूँ जब getLocalHost()विफल रहता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.