2010-03-04 18 views
41

मैं एक साधारण नेटवर्किंग ऐप लिख रहा हूं ... मुझे नेटवर्क पर मेरी मशीन का असली आईपी जानना होगा, जैसे कि 1 9 2.168.1.3। getLocalHost 127.0.0.1 देता है (लिनक्स पर, अगर यह विंडोज़ पर समान है) यह कैसे करें ?;जावा InetAddress.getLocalHost(); 127.0.0.1 देता है ... वास्तविक आईपी कैसे प्राप्त करें?

+0

मेरी खिड़की में, println (InetAddress.getLocalHost() getHostAddress()।); प्रिंट 10.50.16.136 –

+0

127.0.1.1 मेरे लिए (उबंटू) – sfussenegger

+0

दिलचस्प ... सही जवाब हालांकि यह काम नहीं कर रहा है? – sfussenegger

उत्तर

3

आपके कंप्यूटर में कई आईपी हो सकते हैं। आप कैसे जानते हैं कि कौन सा? जिस तरह से मैं करता हूं वह एक और मशीन पर चलने वाला एक बहुत ही सरल सीजीआई है जो आईपी को वापस देखता है, और मैंने इसे तब मारा जब मुझे पता होना चाहिए कि मेरा आईपी बाहरी दुनिया की तरह दिखता है।

21

चूंकि मशीन में कई पते हो सकते हैं, यह निर्धारित करना मुश्किल है कि आपके लिए कौन सा एक है। आम तौर पर, आप चाहते हैं कि सिस्टम अपनी रूटिंग तालिका के आधार पर आईपी असाइन करे। परिणाम आईपी पर निर्भर करता है के रूप में आप से कनेक्ट करना चाहते हैं, तो इसे आसानी चाल है: बस एक कनेक्शन बना सकते हैं और देखते हैं कि क्या आप ओएस से मिल गया है पता:

// output on my machine: "192.168.1.102" 
Socket s = new Socket("192.168.1.1", 80); 
System.out.println(s.getLocalAddress().getHostAddress()); 
s.close(); 

// output on my machine: "127.0.1.1" 
System.out.println(InetAddress.getLocalHost().getHostAddress()); 

मैं कि क्या यकीन नहीं है यद्यपि कनेक्शन स्थापित किए बिना ऐसा करना संभव है। मुझे लगता है कि मैंने एक बार पर्ल (या सी?) के साथ ऐसा करने में कामयाब रहा है, लेकिन मुझे जावा के बारे में मत पूछो। मुझे लगता है कि वास्तव में इसे कनेक्ट किए बिना यूडीपी सॉकेट (डेटाग्राम सॉकेट) बनाना संभव हो सकता है।

यदि कोई एनएटी राउटर है जिस तरह से आप आईपी प्राप्त नहीं कर पाएंगे कि रिमोट होस्ट हालांकि देखेंगे। हालांकि, जैसा कि आपने 1 9 2 दिया था। * उदाहरण के तौर पर, मुझे लगता है कि आपको परवाह नहीं है।

28

यदि आप वास्तव में मशीन पर सभी आईपी पते के साथ काम करना चाहते हैं तो आप उन्हें नेटवर्कइंटरफेस क्लास के साथ प्राप्त कर सकते हैं। बेशक, आपको उस व्यक्ति की आवश्यकता है जिसे आप वास्तव में उपयोग करना चाहते हैं, लेकिन यह उस पर निर्भर करता है कि आप इसका उपयोग किस प्रकार कर रहे हैं, या आपको एकाधिक पते के लिए इसका उपयोग करने के तरीके का विस्तार करने की आवश्यकता हो सकती है।

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

public class ShowInterfaces 
{ 
     public static void main(String[] args) throws Exception 
     { 
       System.out.println("Host addr: " + InetAddress.getLocalHost().getHostAddress()); // often returns "127.0.0.1" 
       Enumeration<NetworkInterface> n = NetworkInterface.getNetworkInterfaces(); 
       for (; n.hasMoreElements();) 
       { 
         NetworkInterface e = n.nextElement(); 
         System.out.println("Interface: " + e.getName()); 
         Enumeration<InetAddress> a = e.getInetAddresses(); 
         for (; a.hasMoreElements();) 
         { 
           InetAddress addr = a.nextElement(); 
           System.out.println(" " + addr.getHostAddress()); 
         } 
       } 
     } 
} 
+15

'जबकि (x.hasMoreElements()) {}' '(x.hasMoreElements();) {}' – sync

17

इसे ठीक करने के लिए:

  1. अपने होस्ट नाम का पता लगाएं। टाइप करें: hostname। उदाहरण के लिए, आप पाते हैं कि आपका होस्टनाम mycomputer.xzy.com

  2. अपना होस्ट नाम अपनी मेजबान फ़ाइल में रखें। /etc/hosts

    10.50.16.136 mycomputer.xzy.com 
    
8

के रूप में इस तरह के यहाँ एक तरह से आईपीवी 6 और लूपबैक परिणाम से बचना है।

public InetAddress getCurrentIp() { 
      try { 
       Enumeration<NetworkInterface> networkInterfaces = NetworkInterface 
         .getNetworkInterfaces(); 
       while (networkInterfaces.hasMoreElements()) { 
        NetworkInterface ni = (NetworkInterface) networkInterfaces 
          .nextElement(); 
        Enumeration<InetAddress> nias = ni.getInetAddresses(); 
        while(nias.hasMoreElements()) { 
         InetAddress ia= (InetAddress) nias.nextElement(); 
         if (!ia.isLinkLocalAddress() 
         && !ia.isLoopbackAddress() 
         && ia instanceof Inet4Address) { 
          return ia; 
         } 
        } 
       } 
      } catch (SocketException e) { 
       LOG.error("unable to get current IP " + e.getMessage(), e); 
      } 
      return null; 
     } 
1

वर्तमान उदाहरण से वर्तमान अनुरोध प्राप्त

HttpServletRequest httpServletRequest = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); 

तो अनुरोध

ip = httpServletRequest.getRemoteAddr(); 
+1

के लिए 'neater' होगा, कोड/समाधान के बारे में संक्षिप्त समेत यह उत्तर एक पूर्ण होगा! –

+0

यह उत्तर सही की तरह लगता है। मैं अपने सर्वर पर एक smpp अनुरोध पर क्लाइंट अनुरोध पता की तलाश में हूं – PhillipMwaniki

-4

मामले में आप अपने पीसी के आईपी पते प्राप्त करना चाहते से पता मिलता है, आप "InetAddress" ऑब्जेक्ट का उपयोग करना होगा, जो "java.net.InetAddress" लाइब्रेरी में मौजूद है।

निम्नलिखित विधि आपके आईपी रिटर्न:

public String getIp() { 

    String myIp = ""; 
    InetAddress ip; 

    try { 
     ip = InetAddress.getLocalHost(); 
     myIp = ip.getHostAddress();  // This method returns the IP. 
    } catch (UnknownHostException e) { 
     e.printStackTrace(); 
    } 

    return myIp; 
} 
2
इसके बजाय का उपयोग कर InetAddress.getHostAddress(), मैं getHost4Address दिनचर्या है कि मैं पहली गैर लूपबैक पता पाने के लिए लिखा था फोन का

...

import java.net.InterfaceAddress; 
import java.net.NetworkInterface; 
import java.util.Collections; 
import java.util.HashSet; 
import java.util.Set; 


private String[] getHostAddresses() { 
    Set<String> HostAddresses = new HashSet<>(); 
    try { 
    for (NetworkInterface ni : Collections.list(NetworkInterface.getNetworkInterfaces())) { 
     if (!ni.isLoopback() && ni.isUp() && ni.getHardwareAddress() != null) { 
     for (InterfaceAddress ia : ni.getInterfaceAddresses()) { 
      if (ia.getBroadcast() != null) { //If limited to IPV4 
      HostAddresses.add(ia.getAddress().getHostAddress()); 
      } 
     } 
     } 
    } 
    } catch (SocketException e) { } 
    return HostAddresses.toArray(new String[0]); 
} 

यह जाँच करें:

/** 
* Returns this host's non-loopback IPv4 addresses. 
* 
* @return 
* @throws SocketException 
*/ 
private static List<Inet4Address> getInet4Addresses() throws SocketException { 
    List<Inet4Address> ret = new ArrayList<Inet4Address>(); 

    Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces(); 
    for (NetworkInterface netint : Collections.list(nets)) { 
     Enumeration<InetAddress> inetAddresses = netint.getInetAddresses(); 
     for (InetAddress inetAddress : Collections.list(inetAddresses)) { 
      if (inetAddress instanceof Inet4Address && !inetAddress.isLoopbackAddress()) { 
       ret.add((Inet4Address)inetAddress); 
      } 
     } 
    } 

    return ret; 
} 

/** 
* Returns this host's first non-loopback IPv4 address string in textual 
* representation. 
* 
* @return 
* @throws SocketException 
*/ 
private static String getHost4Address() throws SocketException { 
    List<Inet4Address> inet4 = getInet4Addresses(); 
    return !inet4.isEmpty() 
      ? inet4.get(0).getHostAddress() 
      : null; 
} 
2

मैं इस कोड लिखा है!

मेरे लिए:

  • लूपबैक नहीं होना चाहिए!
  • यूपी होना चाहिए!
  • मैक पता होना आवश्यक है (शून्य नहीं है)
संबंधित मुद्दे