inetaddress.getlocalhost () يلقي مجهولة
-
18-09-2019 - |
سؤال
أقوم باختبار تطبيق خادمنا (جافا مكتوب) على أنظمة تشغيل مختلفة ويعتقد أن 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()
فشل.