Java получает мой IP-адрес

Я пытаюсь получить свой IP-адрес в Интернете на Java, но я продолжаю получать свой локальный адрес (например: 127.0.0.1), когда мой IP-адрес равен 192.168.0.xxx

Я использую строку:

InetAddress.getLocalHost().getHostAddress(); 

который кажется стандартным для получения IP-адреса, но это не то, что я ищу. В каждом учебнике говорится, что нужно использовать эту строку, поэтому я немного запутался.

Может кто-нибудь, пожалуйста, дайте мне знать, как я могу получить свой правильный IP-адрес, пожалуйста?


Я запускаю устройство, подключенное к Wi-Fi, и я не использую какой-либо кабель. Я подключаюсь к серверу, используя IP, предоставленный ifconfig inet addr, и я ищу, чтобы получить inet addr устройства. Я мог проверить IP-адрес сокета на стороне сервера, но подумал, что было бы лучше, если устройство (клиент) сообщает серверу, какой IP-адрес он ожидает от других устройств для подключения.

Класс NetworkInterface содержит все соответствующие методы, но имейте в виду, что нет такой вещи, как «мой IP». Машина может иметь несколько интерфейсов, и каждый интерфейс может иметь несколько IP-адресов.

Вы можете перечислить их все с помощью этого classа, но какой интерфейс и IP вы выбираете из списка, зависит от того, что именно вам нужно использовать для этого IP.

( InetAddress.getLocalHost() не InetAddress.getLocalHost() к вашим интерфейсам, он просто возвращает константу 127.0.0.1 (для IPv4))

  String ip; try { Enumeration interfaces = NetworkInterface.getNetworkInterfaces(); while (interfaces.hasMoreElements()) { NetworkInterface iface = interfaces.nextElement(); // filters out 127.0.0.1 and inactive interfaces if (iface.isLoopback() || !iface.isUp()) continue; Enumeration addresses = iface.getInetAddresses(); while(addresses.hasMoreElements()) { InetAddress addr = addresses.nextElement(); ip = addr.getHostAddress(); System.out.println(iface.getDisplayName() + " " + ip); } } } catch (SocketException e) { throw new RuntimeException(e); } 

Давайте попросим AWS

 URL url = new URL("http://checkip.amazonaws.com/"); BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream())); System.out.println(br.readLine()); 

РЕДАКТИРОВАТЬ

Прежде чем вы спустили вниз, я хорошо знаю, что это не Java-решение. Это общее решение для любого языка программирования. Другие решения для меня тоже не работают. Также я считаю, что более простой способ узнать свой IP-адрес – пойти в Интернет. Это может быть любой сайт, сервер может вернуть обратно ваш IP-адрес клиента, который он получил в запросе. Вы можете настроить для этого свою конечную точку.

Еще один вариант для сетевого интерфейса по умолчанию, просто я пытался 5 минут назад и увидел ваш вопрос 🙂

 InetAddress[] localaddr; try { localaddr = InetAddress.getAllByName("host.name"); for(int i = 0; i < localaddr.length; i++){ System.out.println("\n" + localaddr[i].getHostAddress()); } } catch (UnknownHostException e) { e.printStackTrace(); } 

Если бы та же проблема, нашел решение на этой странице: http://mrhawy.blogspot.it/2012/05/how-to-get-your-external-ip-address-in.html

  public String getIpAddress() throws MalformedURLException, IOException { URL myIP = new URL("http://api.externalip.net/ip/"); BufferedReader in = new BufferedReader( new InputStreamReader(myIP.openStream()) ); return in.readLine(); } 

имел некоторые проблемы с этим кодом в долгосрочной перспективе, несколько раз в неделю сервер просто не отвечает.

новое решение:

 public static String getIpAddress() { URL myIP; try { myIP = new URL("http://api.externalip.net/ip/"); BufferedReader in = new BufferedReader( new InputStreamReader(myIP.openStream()) ); return in.readLine(); } catch (Exception e) { try { myIP = new URL("http://myip.dnsomatic.com/"); BufferedReader in = new BufferedReader( new InputStreamReader(myIP.openStream()) ); return in.readLine(); } catch (Exception e1) { try { myIP = new URL("http://icanhazip.com/"); BufferedReader in = new BufferedReader( new InputStreamReader(myIP.openStream()) ); return in.readLine(); } catch (Exception e2) { e2.printStackTrace(); } } } return null; } 
 //This program is find your exact LAN(Local Machine on which your are //runing this program) IP Address import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.util.Enumeration; public class GetMyIPAddress { public static void main(String gks[]) throws SocketException{ Enumeration e = NetworkInterface.getNetworkInterfaces(); int ctr=0; while(e.hasMoreElements()) { NetworkInterface n = (NetworkInterface) e.nextElement(); Enumeration ee = n.getInetAddresses(); while (ee.hasMoreElements() && ctr<3) { ctr++; if(ctr==3) break; InetAddress i = (InetAddress) ee.nextElement(); if(ctr==2) System.out.println(i.getHostAddress()); } } } } в //This program is find your exact LAN(Local Machine on which your are //runing this program) IP Address import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.util.Enumeration; public class GetMyIPAddress { public static void main(String gks[]) throws SocketException{ Enumeration e = NetworkInterface.getNetworkInterfaces(); int ctr=0; while(e.hasMoreElements()) { NetworkInterface n = (NetworkInterface) e.nextElement(); Enumeration ee = n.getInetAddresses(); while (ee.hasMoreElements() && ctr<3) { ctr++; if(ctr==3) break; InetAddress i = (InetAddress) ee.nextElement(); if(ctr==2) System.out.println(i.getHostAddress()); } } } } 

Мое решение, которое возвращает только 1 адрес Ip4:

 try { Enumeration interfaces = NetworkInterface.getNetworkInterfaces(); while (interfaces.hasMoreElements()) { NetworkInterface iface = interfaces.nextElement(); if (iface.isLoopback() || !iface.isUp() || iface.isVirtual() || iface.isPointToPoint()) continue; Enumeration addresses = iface.getInetAddresses(); while(addresses.hasMoreElements()) { InetAddress addr = addresses.nextElement(); final String ip = addr.getHostAddress(); if(Inet4Address.class == addr.getClass()) return ip; } } } catch (SocketException e) { throw new RuntimeException(e); } return null; 

Вот мой подход к получению IP-адреса.

  1. Получить адрес шлюза по умолчанию
  2. Получить весь адрес на вашем ПК
  3. Теперь в вашем IP-адресе (предположим, 192.168.100.4) и IP-адрес шлюза по умолчанию (предположим, 192.168.100.1) первые 9 цифр адреса должны быть одинаковыми, поэтому любой IP-адрес, который заполняет этот критерий, является вашим IP-адресом.

См. Ниже полный рабочий код.

 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.util.Enumeration; import java.util.Iterator; import java.util.StringTokenizer; import java.util.TreeSet; public class MyIpAddress { public static void main(String[] args) { // doPortForwarding(); MyIpAddress myIpAddress = new MyIpAddress(); // get default address String yourIp = myIpAddress.getYourIp(myIpAddress .getDefaultGateWayAddress()); System.out.println(yourIp); // get } // amin // return ip address for which u need to do port forwarding private String getYourIp(String defaultAddress) { String temp = defaultAddress.substring(0, 11); String ipToForward = ""; TreeSet ipAddrs = getIpAddressList(); for (Iterator iterator = ipAddrs.iterator(); iterator.hasNext();) { String tempIp = iterator.next(); if (tempIp.contains(temp)) { ipToForward = tempIp; break; } } return ipToForward; }// ipForPortForwarding // get the ipaddress list private TreeSet getIpAddressList() { TreeSet ipAddrs = new TreeSet(); try { Enumeration interfaces = NetworkInterface .getNetworkInterfaces(); while (interfaces.hasMoreElements()) { NetworkInterface iface = interfaces.nextElement(); // filters out 127.0.0.1 and inactive interfaces if (iface.isLoopback() || !iface.isUp()) continue; Enumeration addresses = iface.getInetAddresses(); while (addresses.hasMoreElements()) { InetAddress addr = addresses.nextElement(); ipAddrs.add(addr.getHostAddress()); }// 2 nd while }// 1 st while } catch (SocketException e) { // TODO Auto-generated catch block e.printStackTrace(); } return ipAddrs; }// getIpAddressList // get default gateway address in java private String getDefaultGateWayAddress() { String defaultAddress = ""; try { Process result = Runtime.getRuntime().exec("netstat -rn"); BufferedReader output = new BufferedReader(new InputStreamReader( result.getInputStream())); String line = output.readLine(); while (line != null) { if (line.contains("0.0.0.0")) { StringTokenizer stringTokenizer = new StringTokenizer(line); stringTokenizer.nextElement();// first string is 0.0.0.0 stringTokenizer.nextElement();// second string is 0.0.0.0 defaultAddress = (String) stringTokenizer.nextElement(); // this is our default address break; } line = output.readLine(); }// while } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return defaultAddress; }// getDefaultAddress } 

Вам нужно получить jar jsoup здесь, добавить jar jsoup в ваш проект java и интерпретировать эти строки кода, и вы получите свой адрес ip,

 Document doc = Jsoup.connect("https://whatismyipaddress.com/").timeout(10000).get() ; Elements el = doc.select("div#section_left") ; Element e = el.select("a").get( System.out.println(e.text()); 
  • Странная проблема с WiFi на HP ab522tx
  • Список Wifi пуст в Windows 10
  • Проверьте Wi-Fi и GPS-соединение или нет в Android?
  • Wifi Connect-Disconnect Listener
  • В гостевой сети Windows 7 используется один адаптер для приема и второй адаптер для создания хост-сети
  • Доступ к информации о WiFi в iPhone через SDK
  • Как пользователи / разработчики могут установить конфигурацию прокси-сервера Android для версий 2.x?
  • Как программно создавать и читать конфигурации WEP / EAP WiFi в Android?
  • Android, Как обрабатывать изменения в сети (от GPRS до Wi-Fi и наоборот) при опросе данных
  • Точка доступа Wi-Fi с учетной записью
  • Как избежать задержки в сообщениях Android GCM / изменении сердечного ритма
  • Interesting Posts
    Давайте будем гением компьютера.