2009-06-30 19 views
20

में प्राप्त नहीं किया गया यह कोड मेरा स्थानीय आईपी पता 1 9 2.xxx.x.xxx के रूप में वापस करने के लिए प्रयुक्त होता था लेकिन अब यह 127.0.0.1 लौटा रहा है। कृपया मेरी मदद करें क्यों एक ही कोड अलग-अलग मूल्य लौटा रहा है। क्या ऐसा कुछ है जिसे मुझे लिनक्स ओएस पर देखना है।आईपी पता जावा

import java.util.*; 
import java.lang.*; 
import java.net.*; 

public class GetOwnIP 
{ 
    public static void main(String args[]) { 
    try{ 
     InetAddress ownIP=InetAddress.getLocalHost(); 
     System.out.println("IP of my system is := "+ownIP.getHostAddress()); 
    }catch (Exception e){ 
     System.out.println("Exception caught ="+e.getMessage()); 
    } 
    } 
} 

उत्तर

30

127.0.0.1 लूपबैक एडाप्टर है - यह (कुछ malfomed) प्रश्न के पूरी तरह से सही जवाब है, "मेरे आईपी पते क्या है?"

समस्या यह है कि एकाधिक उस प्रश्न के सही उत्तर हैं।

संपादित करें: getLocalHost के लिये दस्तावेज कहते हैं:

अगर वहाँ एक सुरक्षा प्रबंधक है, इसका checkConnect विधि स्थानीय होस्ट नाम के साथ कहा जाता है और -1 अपने तर्क के रूप में अगर ऑपरेशन है को देखने के लिए की अनुमति है। यदि ऑपरेशन की अनुमति नहीं है, तो का प्रतिनिधित्व करने वाला एक इनडेट एड्रेस लूपबैक पता लौटा दिया जाता है।

क्या यह संभव है कि व्यवहार में परिवर्तन अनुमतियों में बदलाव के कारण है?

संपादित करें: मेरा मानना ​​है कि NetworkInterface.getNetworkInterfaces आपको सभी संभावनाओं को समझने की आवश्यकता है। यहाँ एक उदाहरण है जो आभासी पतों प्रदर्शित नहीं करता है, लेकिन "मुख्य" इंटरफेस के लिए काम करता है:

import java.net.*; 
import java.util.*; 

public class Test 
{ 
    public static void main(String[] args) 
     throws Exception // Just for simplicity 
    { 
     for (Enumeration<NetworkInterface> ifaces = 
       NetworkInterface.getNetworkInterfaces(); 
      ifaces.hasMoreElements();) 
     { 
      NetworkInterface iface = ifaces.nextElement(); 
      System.out.println(iface.getName() + ":"); 
      for (Enumeration<InetAddress> addresses = 
        iface.getInetAddresses(); 
       addresses.hasMoreElements();) 
      { 
       InetAddress address = addresses.nextElement(); 
       System.out.println(" " + address); 
      } 
     } 
    } 
} 

(मैं भूल गया था कितना भयंकर Enumeration<T> प्रकार सीधे के साथ काम करने है!)

यहाँ अभी अपने लैपटॉप पर परिणाम:

lo: 
    /127.0.0.1 
eth0: 
    /169.254.148.66 
eth1: 
eth2: 
ppp0: 
    /10.54.251.111 

(मुझे लगता है कि नहीं लगता कि दूर किसी भी बेहद संवेदनशील जानकारी :)

दे रहा है

यदि आप जानते हैं कि आप किस नेटवर्क इंटरफ़ेस का उपयोग करना चाहते हैं, तो NetworkInterface.getByName(...) पर कॉल करें और फिर उस इंटरफ़ेस के लिए पते देखें (जैसा ऊपर दिए गए कोड में दिखाया गया है)।

+1

उपरोक्त लूप में, आप नेटवर्कइंटरफेस # isLoopback() की जांच करके लूपबैक को भी छोड़ सकते हैं। – omerkudat

+2

आईपी पते से पहले एक स्लैश क्यों है? –

+1

@ Matías यह एक इंटएड्रेस ऑब्जेक्ट का पता लगाने का जावा टूस्ट्रिंग है। DotHostAddress() केवल डॉट-अलग संख्या प्राप्त करने के लिए। –

6

जब आप InetAddress.getLocalHost() का उपयोग करते हैं तो आपको एक विशेष इंटरफ़ेस प्राप्त करने की गारंटी नहीं है, यानी। आप लूपबैक (127) इंटरफेस या एक कनेक्टेड प्राप्त कर सकते हैं।

यह सुनिश्चित करने के लिए कि आप हमेशा बाहरी इंटरफ़ेस प्राप्त करें, आपको java.net.NetworkInterface क्लास का उपयोग करना चाहिए। स्थैतिक getByName (स्ट्रिंग) कक्षा आपको परिभाषित नाम (जैसे "eth0") के साथ इंटरफेस देगी। फिर आप उस इंटरफ़ेस से जुड़े आईपी पते (केवल एक हो सकते हैं) प्राप्त करने के लिए getInetAddresses() फ़ंक्शन का उपयोग कर सकते हैं।

NetworkInterface ni = NetworkInterface.getByName("eth1"); 
ni.getInetAddresses(); 
2

अपनी/etc/होस्ट फ़ाइल की जांच करें। यदि आप पहले 127.0.0.1 डालते हैं, तो यह परिणाम के रूप में इसे वापस कर देगा।

आईपी पता प्राप्त करने का सही तरीका NetworkInterface.getNetworkInterfaces() का उपयोग करना है और उनमें से प्रत्येक पर getInetAddresses() चलाएं।

-1

इसका कारण यह है कि आप/आदि में एक पंक्ति है/ 127.0.0.1 स्थानीय होस्ट तरह मेजबान आप 192.xxx की आवश्यकता है।xxx.xxx localhost

हालांकि कृपया ध्यान दें कि कोड कोड को हल करने के लिए यह बहुत बुरा होगा, आपको linux config फ़ाइलों को संशोधित नहीं करना चाहिए। न केवल यह सही है (और आपके लिनक्स बॉक्स पर कुछ अन्य नेटवर्क जागरूक ऐप्स तोड़ने का जोखिम) यह कहीं और भी काम नहीं करेगा (जब तक कि उन बक्से के व्यवस्थापक भी दिमाग की तरह न हों)।

InetAddress.getLocalHost() के लिए javadoc; पढ़ें ".... लूपबैक पते का प्रतिनिधित्व करने वाला एक इंट एड्रेस वापस आ गया है।" इसलिए ऐसा लगता है कि getLocalHost() का कार्यान्वयन आपके यूनिक्स और विन बॉक्स पर गलत है। लूपबैक पता है लगभग allways 127.0.0.1

मिले इस टिप्पणी "एक मेजबान कई आईपी पते हो सकते हैं और अन्य मेजबान भिन्न पतों का उपयोग करने के लिए इसे तक पहुँचने के लिए हो सकता है। उदाहरण के इंट्रानेट पर होस्ट करता है उपयोग करना पड़ सकता 192.168.0.100 , लेकिन बाहरी मशीनों को 65.123.66.124 का उपयोग करना पड़ सकता है। यदि आपके पास किसी अन्य होस्ट के लिए सॉकेट कनेक्शन है तो आप सॉकेट.getLocalAddress() को सॉकेट के लिए कौन सा स्थानीय पता उपयोग किया जाता है, यह जानने के लिए कॉल कर सकते हैं। "

0

आप अपने सिस्टम के सभी नेटवर्क इंटरफेस के Enumeration को पुनर्प्राप्त करने के लिए NetworkInterface.getNetworkInterfaces() विधि का उपयोग कर सकते हैं।

NetworkInterface उदाहरणों में से प्रत्येक के लिए, आप तो getInetAddresses() विधि नेटवर्क इंटरफेस के साथ जुड़े InetAddress उदाहरणों के सभी का एक Enumeration को पुनः प्राप्त करने के लिए उपयोग कर सकते हैं।

अंत में, आप प्रत्येक InetAddress उदाहरण पर getHostAddress() विधि का उपयोग कर सकते हैं ताकि पाठ में आईपी पता पुनर्प्राप्त किया जा सके।

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