سؤال

أقوم باختبار تطبيق خادمنا (جافا مكتوب) على أنظمة تشغيل مختلفة ويعتقد أن OpenSolaris (2008.11) سيكون أقل مزعج بسبب تكامل جافا الجميل. اتضح أنني كنت مخطئا، كما في نهاية المطاف مع مجهولة

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. هل هناك أي شيء مميز للنمو الذي لست على علم به؟

أي تلميحات تقدر، شكرا.

هل كانت مفيدة؟

المحلول

في تقليد جيد يمكنني الإجابة على سؤالي مرة أخرى:

يبدو أن InetAddress.getLocalHost() يتجاهل /etc/resolv.conf ولكن يبدو فقط في ملف / إلخ / المضيف (حيث لم أقم بتحديد أي شيء إلى جانب المحلي). إضافة عنوان IP واسم المضيف إلى هذا الملف يحل المشكلة وذهب الاستثناء.


المذكورة أعلاه صحيحة تقريبا، وحصلت على تلميح من الأعلى وحصلت مشكلتي ... شكرا.

ولكن لتحسين هذا، أقدم تغييرات خطوات خطوات، بحيث ستكون مفيدا للمستخدمين السذاجة.

خطوات:

  • فتح / الخ / المضيفين، قد تبدو الإدخالات أدناه.

    127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4  
    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    
  • تحتاج إلى إضافة سطر آخر فوق هذا من خلال أي محرر مثل السادس أو 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 ... Code تتم عملك.

نصائح أخرى

أنا أستعمل NetworkInterface.getNetworkInterfaces() كعودة مرة أخرى عندما InetAddress.getLocalHost() يلقي an. 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())  // If I want loopback, I would use "localhost" or "127.0.0.1".
      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());
  }
}

البحث المضيف على استخدامات Solaris /etc/nsswitch.conf لذلك اعتمادا على خط "المضيفين:" يقول إنه يحدد ما إذا كان /etc/hosts, يجب استشارة NIS و DNS و / أو LDAP.

إذا كنت تستخدم فقط المضيفين و DNS يجب أن يكون لديك هذا /etc/nsswitch.conf:

المضيفين: الملفات DNS

السبب nslookup desvearth01 يعمل هو ل nslookup الأمر يستشير مباشرة. /etc/resolv.conf. وبعد إذا كنت ترغب في القيام باختبار أفضل سطر الأوامر، استخدم الأمر:

Getent Hosts desvearth01.

تظهر هذه الأخطاء عندما غيرت اسم محطة العمل وحاولت بدء تشغيل Glassfish 2. يجب عليك أيضا إعادة تسمية الإدخال في / إلخ / المضيفين، شيء من هذا القبيل:

127.0.0.1       localhost
127.0.1.1       MyNewName

على مثيل الأمازون، كنت أواجه نفس المشكلة، وكان هناك مشكلة تكوين 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 مرة أخرى نفس اسم المضيف

$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

الدفع / الخ / اسم المضيف ثم ضع اسم المضيف الخاص بك إلى ملف يستضيف.

إذا رأيت هذه الرسالة مما تحتاج إلى تعيين اسم المضيف مع hostname superhost.domain أمر!

بعد هذا، تحقق من /etc/hosts يحتوي الملف على سلسلة مثل هذا 127.0.0.1 localhost.

أيضا، تحقق من هذا الأمر uname -a إرجاع شيء مثل هذا:

لينكس superhost.domain. 2.6.38-8-Server # 42-Ubuntu SMP Mon Apr 11 Apr 11 03:49:04 UTC 2011 X86_64 X86_64 X86_64 جنو / لينكس

ليس كذلك!!!!

لينكس (لا أحد) 2.6.38-8-Server # 42-Ubuntu SMP Mon Apr 11 Apr 11 03:49:04 UTC 2011 X86_64 X86_64 X86_64 جنو / لينكس

يوجد خيار آخر في هذا المنشور (في الواقع، ما هو في ملف / ETC / SYSCONFIG / Network الخاص بك باسم مضيفك ... عن طريق تغييره إلى اسم FQDN يعمل على إصلاح هذه المشكلة).

Java GetLocalhost () UnknownhostException / ETC / Hosts File يختلف Linux API؟

أواجه مشكلات حول هذا أيضا. أحتاج إلى إجراء مزيد من الاختبار، لكن يبدوNetworkInterface.getNetworkInterfaces() يمكن أن يكون أكثر موثوقية. أعتقد أن هذا لا يفعل البحث، ولكن فقط الاستيلاء على الملكية الفكرية.

أنا أستخدمه ك "الأفضل" عندما getLocalHost() فشل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top