InetAddress.getLocalHost () พ่น UnknownHostException


88

ฉันกำลังทดสอบเซิร์ฟเวอร์แอปพลิเคชันของเรา (เขียน Java) บนระบบปฏิบัติการอื่นและคิดว่า OpenSolaris (2008.11) จะลำบากน้อยที่สุดเนื่องจากการรวม Java ที่ดี ปรากฎว่าฉันคิดผิดเพราะฉันจบลงด้วย 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

พบสิ่งนี้ช้าเกินไป เข้ารหัสโซลูชัน 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ไฟล์ นี่เป็นข้อผิดพลาดได้ง่ายเปราะอาจต้องเข้าถึงรูทและใช้ไม่ได้กับทุกระบบปฏิบัติการ


6

ในอินสแตนซ์ amazon ของฉันฉันประสบปัญหาเดียวกันมีปัญหาการกำหนดค่า DNS เริ่มต้น ดังนั้นเพื่อแก้ไขปัญหาฉันได้ทำตามขั้นตอนเหล่านี้ -

รับชื่อโฮสต์ของคุณ

$hostname
ip-10-122-16-169

ping ไปยังชื่อโฮสต์

$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

ทำงานให้กับอินสแตนซ์ ec2 ขอบคุณ
baybatu

4

การค้นหาโฮสต์บน Solaris ใช้/etc/nsswitch.confดังนั้นขึ้นอยู่กับสิ่งที่บรรทัด "โฮสต์:" ระบุว่า/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


1

หากคุณเห็นข้อความนี้เกินกว่าที่คุณต้องการตั้งชื่อโฮสต์ด้วยคำ hostname superhost.domain สั่ง !

หลังจากนี้ตรวจสอบไฟล์มีสตริงเช่นนี้/etc/hosts127.0.0.1 localhost

นอกจากนี้ตรวจสอบว่าคำสั่งuname -aส่งคืนสิ่งนี้:

Linux superhost.domain 2.6.38-8-server # 42-Ubuntu SMP จันทร์ 11 เมษายน 03:49:04 UTC 2011 x86_64 x86_64 x86_64 GNU / Linux

ไม่เหมือน!!!!

Linux (ไม่มี) 2.6.38-8-server # 42-Ubuntu SMP จ. 11 เม.ย. 03:49:04 UTC 2011 x86_64 x86_64 x86_64 GNU / Linux


0

ตัวเลือกอื่นอยู่ในโพสต์นี้ (อันที่จริงไฟล์ / etc / sysconfig / network ของคุณสำหรับชื่อโฮสต์ของคุณ ... โดยการเปลี่ยนเป็นชื่อ FQDN จะช่วยแก้ปัญหานี้ได้)

java getLocalHost () ไฟล์ UnknownHostException / etc / hosts แตกต่างจาก linux api หรือไม่


0

ฉันมีปัญหาเกี่ยวกับเรื่องนี้เช่นกัน ฉันต้องทำการทดสอบเพิ่มเติม แต่ดูเหมือนว่า NetworkInterface.getNetworkInterfaces()จะน่าเชื่อถือกว่านี้ ฉันคิดว่านี่ไม่ได้ทำการค้นหา แต่เพียงแค่คว้า IP

ฉันใช้มันเป็น 'ดีที่สุดถัดไป' เมื่อgetLocalHost()ล้มเหลว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.