दिलचस्प पोस्ट
स्क्रिप्टिंग तालिका डेटा के लिए उपकरण JavaScript के बिना HTML सामग्री के साथ टूलटिप सीएसएस स्टाइलिंग चेकबॉक्सेस प्रत्येक कॉलम सेल के लिए स्तंभ कक्षों का विस्तार करना सीमके में, मैं डीबग और रिलीज डायरेक्टरी के आसपास काम कैसे कर सकता हूं, जो Visual Studio 2010 जोड़ने की कोशिश करता है? .delegate () बनाम .on () दो सरणी सूची को एक नई सरणी सूची में मिलाकर, कोई डुप्लिकेट और क्रम में, जावा में तर्क के साथ पासिंग-चर-से- vbscript-to-batch-file event.wheelDelta रिटर्न अनिर्धारित चेक किए गए रेडियो बटन के लेबल के लिए सीएसएस चयनकर्ता मैं एक्लिप्स में लाइन नंबर कैसे दिखा सकता हूं? अनिर्दिष्ट, अपरिभाषित और कार्यान्वयन परिभाषित व्यवहार सी के लिए WIKI एंड्रॉइड के पूर्व 4.2 संस्करणों पर आरटीएल भाषाओं को कैसे प्रबंधित करें? Django आराम फ्रेमवर्क csrf निकालें क्या मुझे हमेशा- viewDidLoad विधि में को कॉल करना है?

जावा में होस्टनाम प्राप्त करने का अनुशंसित तरीका

जावा में वर्तमान कंप्यूटर के होस्टनाम को प्राप्त करने के लिए सबसे अच्छा और सबसे पोर्टेबल तरीका निम्न में से कौन सा है?

Runtime.getRuntime().exec("hostname")

बनाम

InetAddress.getLocalHost().getHostName()

Solutions Collecting From Web of "जावा में होस्टनाम प्राप्त करने का अनुशंसित तरीका"

सख्ती से बोल रहा है – आपके पास कोई विकल्प नहीं है, लेकिन hostname(1) या यूनिक्स gethostname(2) । यह आपके कंप्यूटर का नाम है किसी ऐसे आईपी पते से मेजबाननाम को निर्धारित करने का कोई भी प्रयास

 InetAddress.getLocalHost().getHostName() 

कुछ परिस्थितियों में विफल होने के लिए बाध्य है:

  • आईपी ​​पता किसी भी नाम से हल नहीं हो सकता है। खराब डीएनएस सेटअप, खराब सिस्टम सेटअप या खराब प्रदाता सेटअप इस का कारण हो सकता है।
  • DNS में एक नाम में कई उपनाम हो सकते हैं जिन्हें CNAMEs कहा जाता है। ये केवल एक दिशा में ठीक से हल कर सकते हैं: पते का नाम। रिवर्स दिशा अस्पष्ट है। कौन सा "आधिकारिक" नाम है?
  • एक होस्ट के पास कई अलग-अलग आईपी पते हो सकते हैं – और प्रत्येक पते में कई भिन्न नाम हो सकते हैं। दो सामान्य मामले हैं: एक ईथरनेट पोर्ट में कई "तार्किक" आईपी पते हैं या कंप्यूटर के पास कई ईथरनेट बंदरगाह हैं। यह कॉन्फ़िगर करने योग्य है कि क्या वे आईपी साझा करते हैं या अलग-अलग आईपी हैं। इसे "मल्टीहॉम्ड" कहा जाता है
  • DNS में एक नाम कई आईपी पते को हल कर सकता है। और उन पते के सभी एक ही कंप्यूटर पर स्थित नहीं होना चाहिए! (Usecase: लोड संतुलन का एक सरल रूप)
  • चलिए गतिशील आईपी पते के बारे में भी बात करना शुरू नहीं करते हैं।

साथ ही मेजबान (होस्टनाम) के नाम के साथ एक आईपी-एड्रेस के नाम को भ्रमित न करें एक रूपक यह स्पष्ट कर सकता है:

"लंदन" नामक एक बड़ा शहर (सर्वर) है शहर की दीवारों के अंदर बहुत व्यापार होता है। शहर में कई गेट हैं (आईपी पते) प्रत्येक गेट का नाम है ("नॉर्थ गेट", "रिवर गेट", "साउथेम्प्टन गेट" …) लेकिन गेट का नाम शहर का नाम नहीं है। इसके अलावा आप एक गेट के नाम का उपयोग करके शहर का नाम नहीं निकाल सकते हैं – "नॉर्थ गेट" बड़े शहरों में से आधे हिस्से को पकड़ेगा और न सिर्फ एक शहर। हालांकि – एक अजनबी (आईपी पैकेट) नदी के साथ चलता है और एक स्थानीय पूछता है: "मेरे पास एक अजीब पता है: 'रिवरगाट, दूसरा बायां, तीसरा घर'। क्या आप मेरी सहायता कर सकते हैं?" स्थानीय कहते हैं: "बेशक, आप सही रास्ते पर हैं, बस आगे बढ़ो और आधा घंटे में आप अपने गंतव्य पहुंच जाएंगे।"

यह बहुत सुंदर मुझे यह लगता है दिखाता है।

अच्छी खबर यह है: वास्तविक मेजबाननाम आमतौर पर आवश्यक नहीं है। ज्यादातर मामलों में कोई भी नाम जो इस मेजबान पर आईपी पते में हल करता है I (अजनबी उत्तरीगेट द्वारा शहर में प्रवेश कर सकते हैं, लेकिन उपयोगी स्थानीय लोग "2 बायां" भाग का अनुवाद करते हैं।)

यदि शेष कोने वाले मामलों में आपको इस कॉन्फ़िगरेशन सेटिंग का निश्चित स्रोत का उपयोग करना होगा – जो कि सी फ़ंक्शन gethostname(2) । उस समारोह को प्रोग्राम hostname द्वारा भी कहा जाता है

InetAddress.getLocalHost().getHostName() अधिक पोर्टेबल तरीका है।

exec("hostname") वास्तव में hostname कमांड को निष्पादित करने के लिए ऑपरेटिंग सिस्टम को कॉल करता है।

यहां पर कुछ अन्य संबंधित उत्तर दिए गए हैं:

  • जावा चालू मशीन का नाम और लॉग इन उपयोगकर्ता?
  • एक दूरस्थ मशीन द्वारा देखी जाने वाली स्थानीय मशीन का DNS नाम प्राप्त करें

संपादित करें: आपकी स्थिति के आधार पर आपको एह के जवाब या एर्नट एंजेलेन के उत्तर पर यह जानकारी देनी चाहिए कि यह संभवतः काम क्यों नहीं करेगा। ऐसे व्यक्ति के लिए एक उत्तर के रूप में जो विशेष रूप से पोर्टेबल अनुरोध किया है, मुझे अभी भी लगता है कि getHostName() ठीक है, लेकिन वे कुछ अच्छे बिंदुओं को लाते हैं जिन पर विचार किया जाना चाहिए।

जैसा कि अन्य लोगों ने ध्यान दिया है, DNS रिज़ॉल्यूशन पर आधारित होस्टनाम अविश्वसनीय है

चूंकि यह सवाल दुर्भाग्य से 2016 में अभी भी प्रासंगिक है, मैं आपके साथ अपने नेटवर्क-स्वतंत्र समाधान को साझा करना चाहता हूं, साथ ही विभिन्न प्रणालियों पर कुछ परीक्षण चलाता है।

निम्न कोड निम्न करने की कोशिश करता है:

  • विंडोज़ पर

    1. System.getenv() माध्यम से COMPUTERNAME परिवेश चर पढ़ें

    2. Hostname.exe निष्पादित करें और प्रतिक्रिया पढ़ें

  • लिनक्स पर

    1. System.getenv() माध्यम से HOSTNAME परिवेश चर पढ़ें

    2. hostname निष्पादित करें और प्रतिक्रिया पढ़ें

    3. /etc/hostname पढ़ें (ऐसा करने के लिए मैं cat निष्पादित कर रहा हूं क्योंकि स्निपेट में पहले से ही कोड निष्पादित और पढ़ा गया है। बस फ़ाइल पढ़ने में बेहतर होगा, हालांकि)।

कोड:

 public static void main(String[] args) throws IOException { String OS = System.getProperty("os.name").toLowerCase(); if (OS.indexOf("win") >= 0) { System.out.println("Windows computer name throguh env:\"" + System.getenv("COMPUTERNAME") + "\""); System.out.println("Windows computer name through exec:\"" + execReadToString("hostname") + "\""); } else { if (OS.indexOf("nix") >= 0 || OS.indexOf("nux") >= 0) { System.out.println("Linux computer name throguh env:\"" + System.getenv("HOSTNAME") + "\""); System.out.println("Linux computer name through exec:\"" + execReadToString("hostname") + "\""); System.out.println("Linux computer name through /etc/hostname:\"" + execReadToString("cat /etc/hostname") + "\""); } } } public static String execReadToString(String execCommand) throws IOException { Process proc = Runtime.getRuntime().exec(execCommand); try (InputStream stream = proc.getInputStream()) { try (Scanner s = new Scanner(stream).useDelimiter("\\A")) { return s.hasNext() ? s.next() : ""; } } } 

विभिन्न ऑपरेटिंग सिस्टम के लिए परिणाम:

ओपनस्यूज 13.1

 Linux computer name throguh env:"machinename" Linux computer name through exec:"machinename " Linux computer name through /etc/hostname:"" 

उबंटु 14.04 एलटीएस यह एक तरह से अजीब है क्योंकि echo $HOSTNAME सही मेजबाननाम देता है, लेकिन System.getenv("HOSTNAME") नहीं करता है:

 Linux computer name through env:"null" Linux computer name through exec:"machinename " Linux computer name through /etc/hostname:"machinename " 

संपादित करें: legolas108 के अनुसार, यदि आप जावा कोड निष्पादित करने से पहले export HOSTNAME चलाते हैं तो System.getenv("HOSTNAME") , उबंटू 14.04 पर काम करता है।

विंडोज 7

 Windows computer name through env:"MACHINENAME" Windows computer name through exec:"machinename " 

मशीन का नाम बदल दिया गया है लेकिन मैंने पूंजीकरण और संरचना को रखा है। hostname निष्पादित करते समय अतिरिक्त न्यूलाइन को नोट करें, आपको कुछ मामलों में इसे खाते में लेना पड़ सकता है

InetAddress.getLocalHost().getHostName() बेहतर है (जैसा निक द्वारा समझाया गया है), लेकिन अभी भी बहुत अच्छा नहीं

एक होस्ट को कई विभिन्न होस्टनामों के तहत जाना जाता है। आम तौर पर आप अपने होस्ट के विशिष्ट संदर्भ में मेजबाननाम की तलाश करेंगे।

उदाहरण के लिए, वेब अनुप्रयोग में, आप वर्तमान में जिन अनुरोधों को जारी कर रहे हैं, उनके द्वारा होस्ट किए गए होस्टनाम की तलाश में हो सकता है। सबसे अच्छा कैसे पता चलेगा कि एक यह निर्भर करता है कि आप अपने वेब अनुप्रयोग के लिए किस रूपरेखा का उपयोग कर रहे हैं।

किसी अन्य प्रकार की इंटरनेट-फ़ेसिंग सर्विस में, आप चाहते हैं कि होस्ट नाम आपकी सेवा 'बाहर' से उपलब्ध हो। प्रॉक्सी, फ़ायरवॉल इत्यादि के कारण यह मशीन पर होस्ट नाम भी नहीं हो सकता है, जिस पर आपकी सेवा स्थापित है – आप एक उचित डिफ़ॉल्ट के साथ आने की कोशिश कर सकते हैं, लेकिन आपको निश्चित रूप से यह स्थापित करने के लिए इस विन्यास योग्य बनाना चाहिए।

पर्यावरण चर एक उपयोगी साधन भी प्रदान कर सकते हैं – सबसे आधुनिक यूनिक्स / लिनक्स के गोले पर Windows, HOSTNAME पर COMPUTERNAME

देखें: https://stackoverflow.com/a/17956000/768795

इन्हें "पूरक" विधियों के रूप में InetAddress.getLocalHost().getHostName() रूप में उपयोग कर रहा हूँ, क्योंकि चूंकि बहुत से लोग कहते हैं, यह फ़ंक्शन सभी वातावरणों में काम नहीं करता है।

Runtime.getRuntime().exec("hostname") एक और संभावित पूरक है। इस स्तर पर, मैंने इसका इस्तेमाल नहीं किया है।

 import java.net.InetAddress; import java.net.UnknownHostException; // try InetAddress.LocalHost first; // NOTE -- InetAddress.getLocalHost().getHostName() will not work in certain environments. try { String result = InetAddress.getLocalHost().getHostName(); if (StringUtils.isNotEmpty( result)) return result; } catch (UnknownHostException e) { // failed; try alternate means. } // try environment properties. // String host = System.getenv("COMPUTERNAME"); if (host != null) return host; host = System.getenv("HOSTNAME"); if (host != null) return host; // undetermined. return null; 

जावा में वर्तमान कंप्यूटर का होस्टनाम प्राप्त करने का सबसे पोर्टेबल तरीका निम्नानुसार है:

 import java.net.InetAddress; import java.net.UnknownHostException; public class getHostName { public static void main(String[] args) throws UnknownHostException { InetAddress iAddress = InetAddress.getLocalHost(); String hostName = iAddress.getHostName(); //To get the Canonical host name String canonicalHostName = iAddress.getCanonicalHostName(); System.out.println("HostName:" + hostName); System.out.println("Canonical Host Name:" + canonicalHostName); } } 
 hostName == null; Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces(); { while (interfaces.hasMoreElements()) { NetworkInterface nic = interfaces.nextElement(); Enumeration<InetAddress> addresses = nic.getInetAddresses(); while (hostName == null && addresses.hasMoreElements()) { InetAddress address = addresses.nextElement(); if (!address.isLoopbackAddress()) { hostName = address.getHostName(); } } } } 

यद्यपि इस विषय का पहले ही उत्तर दिया जा चुका है हालांकि कहने के लिए अधिक है

सबसे पहले: स्पष्ट रूप से हमें यहां कुछ परिभाषाओं की आवश्यकता है। InetAddress.getLocalHost().getHostName() आपको मेजबान के नाम को एक नेटवर्क परिप्रेक्ष्य से देखा गया है । इस दृष्टिकोण की समस्याओं को अन्य उत्तरों में अच्छी तरह से प्रलेखित किया गया है: अक्सर एक DNS लुकअप की आवश्यकता होती है, यह अस्पष्ट है अगर मेजबान के पास कई नेटवर्क इंटरफेस हैं और यह केवल सादे कभी-कभी विफल हो जाता है (नीचे देखें)।

लेकिन किसी भी ओएस पर एक और नाम भी है। मेजबान का एक नाम जो बूट प्रक्रिया में बहुत जल्द परिभाषित हो जाता है, नेटवर्क शुरू होने से पहले विंडोज इसका नाम कम्प्यूट्यूम के रूप में है , लिनक्स को कर्नेल होस्टनाम कहते हैं और सॉलारिस शब्द नोडनाम का उपयोग करता है। मुझे सबसे अच्छा शब्द computername पसंद है , इसलिए मैं उस शब्द को अब से उपयोग करूँगा।

कम्प्यूट नाम ढूंढना

  • लिनक्स / यूनिक्स पर gethostname() hostname है जिसे आप सी फंक्शन gethostname() , या hostname से शेल या HOSTNAME एनवायरनमेंट वेरिएबल में बाश-जैसे गोले।

  • विंडोज़ पर GetComputerName है जो आपको पर्यावरण चर COMPUTERNAME या Win32 GetComputerName फ़ंक्शन से मिलता है।

जावा में 'कम्प्यूटयूवर' के रूप में परिभाषित किए गए प्राप्त करने का कोई तरीका नहीं है निश्चित रूप से, अन्य उत्तरों में बताए गए समाधान हैं, जैसे Windows कॉलिंग सिस्टम System.getenv("COMPUTERNAME") , लेकिन यूनिक्स / लिनक्स पर जेएनआई / जेएनए या Runtime.exec()Runtime.exec() सहारा किए बिना कोई अच्छा काम नहीं है। यदि आप किसी जेएनआई / जेएनए समाधान को नहीं मानते हैं, तो gethostname4j है जो कि मृतक सरल और प्रयोग करने में आसान है।

दो उदाहरणों पर चलें, एक लिनक्स से और एक सोलारिस से, जो प्रदर्शित करता है कि आप आसानी से उस स्थिति में कैसे पहुंच सकते हैं जहां आप मानक जावा विधियों का उपयोग करते हुए कम्प्यूट नाम प्राप्त नहीं कर सकते।

लिनक्स उदाहरण

नव निर्मित सिस्टम पर, जहां स्थापना के दौरान मेजबान को 'शिकागो' के रूप में नाम दिया गया है, हम अब तथाकथित कर्नेल मेजबाननाम बदलते हैं:

 $ hostnamectl --static set-hostname dallas 

अब कर्नेल होस्टनाम 'डलास' है, जैसा कि होस्टनाम कमांड से स्पष्ट है:

 $ hostname dallas 

लेकिन हम अभी भी हैं

 $ cat /etc/hosts 127.0.0.1 localhost 127.0.0.1 chicago 

इस में कोई मिस कॉन्फ़िगरेशन नहीं है इसका अर्थ है मेजबान के नेटवर्क का नाम (या बल्कि लूपबैक इंटरफ़ेस का नाम) मेजबान के कम्प्यूटयूएन से अलग है।

अब, InetAddress.getLocalHost().getHostName() को निष्पादित करने का प्रयास करें और यह java.net को फेंक देगा.अज्ञातहोस्ट अपवाद आप मूल रूप से फंस गए हैं न तो मूल्य 'डलास' और न ही मूल्य 'शिकागो' को पुनः प्राप्त करने का कोई रास्ता नहीं है।

सोलारिस उदाहरण

नीचे दिया गया उदाहरण सोलारिस 11.3 पर आधारित है।

मेजबान को जानबूझकर कॉन्फ़िगर किया गया है ताकि लूपबैक नाम <> नोडनाम

दूसरे शब्दों में हम हैं:

 $ svccfg -s system/identity:node listprop config ... ... config/loopback astring chicago config/nodename astring dallas 

और / etc / hosts की सामग्री:

 :1 chicago localhost 127.0.0.1 chicago localhost loghost 

और होस्टनाम कमांड का नतीजा होगा:

 $ hostname dallas 

बस लिनक्स उदाहरण की तरह InetAddress.getLocalHost().getHostName() को कॉल करें InetAddress.getLocalHost().getHostName() असफल हो जायेगा

 java.net.UnknownHostException: dallas: dallas: node name or service name not known 

बस लिनक्स उदाहरण की तरह अब आप फंस गए हैं। न तो मूल्य 'डलास' और न ही मूल्य 'शिकागो' को पुनः प्राप्त करने का कोई रास्ता नहीं है।

जब आप वास्तव में इस के साथ संघर्ष करेंगे?

बहुत बार आपको पता चल जाएगा कि InetAddress.getLocalHost().getHostName() वास्तव में एक मान वापस करेगा जो कि कम्प्यूट्यूलेशन के बराबर है। इसलिए कोई समस्या नहीं है (नाम रिज़ॉल्यूशन के ओवरहेड को छोड़कर)

समस्या आमतौर पर पाएस वातावरण में होती है, जहां कंप्यूट के नाम और लूपबैक अंतरफलक के नाम के बीच अंतर होता है। उदाहरण के लिए लोग अमेज़ॅन ईसी 2 में समस्याओं की रिपोर्ट करते हैं।

बग / आरएफई रिपोर्ट

खोज का एक बिट इस आरएफई रिपोर्ट से पता चलता है: link1 , link2 हालांकि, उस रिपोर्ट पर टिप्पणी से देखते हुए यह मुद्दा जेडीके दल द्वारा काफी हद तक गलत समझा गया है, इसलिए यह संभव नहीं है कि इसे संबोधित किया जाएगा।

मुझे अन्य प्रोग्रामिंग भाषाओं में आरएफई की तुलना पसंद है I

यदि आप मेवेन केंद्रीय से बाहरी निर्भरता का उपयोग करने के खिलाफ नहीं हैं, तो मैं इस समस्या को हल करने के लिए gethostname4j लिखा था। यह सिर्फ जेएनए को libc के gethostname फ़ंक्शन को कॉल करने के लिए उपयोग करता है (या कंप्यूटर पर कंप्यूटर का नाम मिलता है) और उसे स्ट्रिंग के रूप में देता है।

https://github.com/mattsheppard/gethostname4j

InetAddress.getLocalHost ()। GetHostName () दो में से सबसे अच्छा तरीका है क्योंकि यह डेवलपर स्तर पर सबसे अच्छा अमूर्त है।