2009-10-02 15 views
9

से सही स्थानीय आईपी पता प्राप्त करें मैं अपने जावा एप्लेट से स्थानीय आईपी पता निर्धारित करना चाहता हूं। समस्या तब होती है जब एक ही मशीन पर कई आईपी एड्रेस होते हैं, जिनमें लैन और इंटरनेट कनेक्शन (हथेली, वीएमवेयर ...) हैं।जावा एप्लेट

public static void main(String[] args) { 
     try { 
     String hostName = InetAddress.getLocalHost().getHostName(); 
     System.out.println("HostName = " + hostName); 
     System.out.println("HostAddressLocal = " + 
      InetAddress.getLocalHost().getHostAddress()); 
     InetAddress[] inetAddresses = InetAddress.getAllByName(hostName); 
     for (InetAddress inetAddress : inetAddresses) { 
      System.out.println("hostAddress = " + inetAddress.getHostAddress()); 
     } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

परिणाम है::

यहाँ मेरी परीक्षा है

HostName = xxxx 
    HostAddressLocal = xx.xx.xx.xx 
    hostAddress = 10.10.11.51 
    hostAddress = 192.168.23.1 
    hostAddress = 192.168.106.1 

जहां xx.xx.xx.xx सही पता नहीं है। सही 10.10.11.51 है। jarnbjo के जवाब में


संपादित करें:

आपका क्रिस्टल बॉल सच कहते हैं। तुम मेरी समस्या समझ गए हो ग्राहक प्रॉक्सी से कनेक्ट हो सकता है, इसलिए मैं आपके पहले बिंदु का उपयोग नहीं कर सकता। अगर मैं अपने कंप्यूटर पर नीचे इस कोड को निष्पादित करें:

Internet IP = /127.0.0.1 

और न 10.10.11.51

+0

क्या आपका मतलब एप्लेट है? मुख्य यूपी पते तक पहुंचने में सक्षम और सक्षम होने के साथ? –

+0

हमें भी यही समस्या थी। – KLE

+3

आप वास्तव में क्या करने की कोशिश कर रहे हैं? आपको इस जानकारी की आवश्यकता क्यों है? क्या होगा यदि उपयोगकर्ता के पास स्थानीय पता नहीं है? क्या होगा यदि उपयोगकर्ता के पास कई इंटरफेस हैं, और कई स्थानीय पते हैं? क्या होगा यदि उपयोगकर्ता के पास आईपीवी 6 है (जो प्रत्येक इंटरफ़ेस में संभावित रूप से कई पते हो सकते हैं)? आपके कार्यक्रम पर कुछ डिज़ाइन समस्या है, इसे इस विशेषता पर सही ढंग से काम करने के लिए भरोसा नहीं करना चाहिए। – Juliano

उत्तर

-1

getHostName के नीचे में() सी समारोह gethostbyname():

Socket s = new Socket("www.w3c.org", 80); 
    InetAddress ip = s.getLocalAddress(); 
    System.out.println("Internet IP = " + ip.toString()); 
    s.close(); 

मैं इस परिणाम की है। वे शुरू में/etc/hosts को देख रहे हैं, फिर DNS के माध्यम से हल करने का प्रयास करें। इसलिए, यदि आप 10.10.11.51 myhostname को/etc/hosts getHostName() को सही ढंग से पहचानना चाहिए विंडोज़ में/etc/hosts/एनायर में \ WINDOWS \ System32 \ Servises या तो एनालॉग है ...

यह केवल नाम संकल्प समस्या है।

अपने कोड में आपको पहले होस्ट का नाम मिलता है (hostName = InetAddress.getLocalHost()। GetHostName(); यह फ़ंक्शन सिस्टम इंस्टॉल होने पर आपके कंप्यूटर का नाम सेट कर देता है। ठोस होस्ट नाम के सभी आईपी (InetAddress.getAllByName (होस्टनाम)) तो फिर तुम मिल - इस वापसी सभी IP इस होस्ट नाम

सरल उदाहरण के लिए संकल्प लिया

1/etc/इस

 
127.0.0.1 localhost 
127.0.1.1 fred-desktop 
तरह मेजबान

अपने कोड वापसी

 
HostName = fred-desktop 
HostAddressLocal = 127.0.1.1 
hostAddress = 127.0.1.1 

2 परिवर्तन/etc/hosts

तरह देखने के लिए मेरी ubuntu बॉक्स के नाम -
 
127.0.0.1 localhost 
127.0.1.1 fred-desktop 
192.168.1.1 fred-desktop 
20.20.20.20 fred-desktop 

अपने कोड

 
HostName = fred-desktop 
HostAddressLocal = 127.0.1.1 
hostAddress = 127.0.1.1 
hostAddress = 192.168.1.1 
hostAddress = 20.20.20.20 

fred-डेस्कटॉप वापस आ जाएगी।

+0

यह सवाल नहीं था। समस्या नाम संकल्प नहीं है, लेकिन तथ्य यह है कि कई इंटरफेस हो सकते हैं। – sleske

+0

बहुत बुरा वोटिंग भी जवाब पर ध्यान नहीं दे रहा है ... –

+0

प्रश्न जावा के लिए है और आप एक अलग उद्देश्य – Mark

11

जैसा कि आप पहले ही खोज चुके हैं, कंप्यूटर के पास विभिन्न आईपी पते के साथ कई नेटवर्क इंटरफेस हो सकते हैं और यह अनुमान लगाने में थोड़ा मुश्किल है कि आप "सही" मानते हैं, क्योंकि वे वास्तव में सही हैं।

मेरी क्रिस्टल बॉल मुझे सुझाव देती है कि आपका मतलब आईपी पता है, जिसे क्लाइंट सर्वर से कनेक्ट करने के लिए उपयोग कर रहा है, जिससे एप्लेट लोड किया गया था।

  • सर्वर पर, आप एक गतिशील रूप से उत्पन्न HTML पृष्ठ पर एप्लेट एम्बेड और एक एप्लेट पैरामीटर के रूप में ग्राहक के आईपी पते जोड़ सकते हैं: यदि हां, तो आप कम से कम दो संभावनाएं है। कम से कम यदि आप प्रॉक्सी पर HTTP नहीं कर रहे हैं, तो वेब सर्वर क्लाइंट के आईपी पते को निर्धारित करने और इसे एप्लेट पर पास करने में सक्षम होना चाहिए।

  • एप्लेट में, आप वेब सर्वर जिसमें से आप एप्लेट लोड करने के लिए TCP सॉकेट खोल सकते हैं और जाँच जो स्थानीय पते के कनेक्शन के लिए किया जा रहा है कर सकते हैं:

Socket s = new Socket("www", 80); 
InetAddress ip = s.getLocalAddress(); 
s.close(); 
+0

के इंटरफेस प्राप्त करने का यह सही तरीका नहीं है धन्यवाद! प्रश्न में मेरा संपादन देखें। – EFalco

+0

डिफ़ॉल्ट सैंडबॉक्स मोड में सुरक्षा अनुमतियों की कमी के कारण इन दिनों आमतौर पर एक एप्लेट में काम नहीं करेगा। एप्लेट की [पॉलिसी फाइल) में आपको एप्लेट को [java.net.NetPermission.getNetworkInformation] (http://docs.oracle.com/javase/7/docs/api/java/net/NetPermission.html) देना होगा ] (http://docs.oracle.com/javase/tutorial/security/tour1/step2.html)। –

+0

"www" के लिए सॉकेट बनाने से काम करना बंद कर दिया गया है, कृपया मेरा प्रश्न देखें: http://stackoverflow.com/questions/28487579/jsp-new-socket-www-80-stopped-working-after-years-of-working- ठीक –

संबंधित मुद्दे