Nie jestem pewien, jak uzyskać zewnętrzny adres IP urządzenia, ponieważ komputer spoza sieci może go zobaczyć.
Moja następująca klasa IPAddress pobiera tylko lokalny adres IP urządzenia.
public class IPAddress {
private InetAddress thisIp;
private String thisIpAddress;
private void setIpAdd() {
try {
InetAddress thisIp = InetAddress.getLocalHost();
thisIpAddress = thisIp.getHostAddress().toString();
} catch (Exception e) {
}
}
protected String getIpAddress() {
setIpAdd();
return thisIpAddress;
}
}
Odpowiedzi:
Nie jestem pewien, czy możesz pobrać ten adres IP z kodu działającego na komputerze lokalnym.
Możesz jednak zbudować kod działający na stronie internetowej, na przykład w JSP, a następnie użyć czegoś, co zwraca adres IP, z którego pochodzi żądanie:
request.getRemoteAddr()
Lub po prostu użyj już istniejących usług, które to robią, a następnie przeanalizuj odpowiedź z usługi, aby znaleźć adres IP.
Korzystaj z usług sieciowych, takich jak AWS i inne
import java.net.*; import java.io.*; URL whatismyip = new URL("http://checkip.amazonaws.com"); BufferedReader in = new BufferedReader(new InputStreamReader( whatismyip.openStream())); String ip = in.readLine(); //you get the IP as a String System.out.println(ip);
źródło
echo $_SERVER['REMOTE_ADDR'];
. Jeśli jest to jedyny lub pierwszy wiersz wyjściowy skryptu, wszystko jest ustawione.Na odpowiedź zasługuje jeden z komentarzy @stivlo:
Możesz skorzystać z usługi Amazon http://checkip.amazonaws.com
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.URL; public class IpChecker { public static String getIp() throws Exception { URL whatismyip = new URL("http://checkip.amazonaws.com"); BufferedReader in = null; try { in = new BufferedReader(new InputStreamReader( whatismyip.openStream())); String ip = in.readLine(); return ip; } finally { if (in != null) { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
źródło
Prawda jest taka: „nie możesz” w tym sensie, w jakim zadałeś pytanie. NAT odbywa się poza protokołem. Jądro twojej maszyny nie ma możliwości dowiedzenia się, w jaki sposób twój NAT mapuje z zewnętrznych na wewnętrzne adresy IP. Inne odpowiedzi oferują sztuczki związane z metodami rozmawiania z zewnętrznymi witrynami internetowymi.
źródło
Wszystko to nadal działa i działa płynnie! (stan na 23 września 2019 r.)
http://curlmyip.com/(17 grudnia 2016 r.)Rada: nie polegaj bezpośrednio tylko na jednym z nich; spróbuj użyć jednego, ale miej plan awaryjny z uwzględnieniem innych! Im więcej używasz, tym lepiej!
Powodzenia!
źródło
Jak napisał @Donal Fellows, musisz zapytać interfejs sieciowy zamiast maszyny. Ten kod z javadocs zadziałał dla mnie:
Poniższy przykładowy program zawiera listę wszystkich interfejsów sieciowych i ich adresów na komputerze:
import java.io.*; import java.net.*; import java.util.*; import static java.lang.System.out; public class ListNets { public static void main(String args[]) throws SocketException { Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces(); for (NetworkInterface netint : Collections.list(nets)) displayInterfaceInformation(netint); } static void displayInterfaceInformation(NetworkInterface netint) throws SocketException { out.printf("Display name: %s\n", netint.getDisplayName()); out.printf("Name: %s\n", netint.getName()); Enumeration<InetAddress> inetAddresses = netint.getInetAddresses(); for (InetAddress inetAddress : Collections.list(inetAddresses)) { out.printf("InetAddress: %s\n", inetAddress); } out.printf("\n"); } }
Poniżej przedstawiono przykładowe dane wyjściowe z przykładowego programu:
Display name: TCP Loopback interface Name: lo InetAddress: /127.0.0.1 Display name: Wireless Network Connection Name: eth0 InetAddress: /192.0.2.0
Z docs.oracle.com
źródło
Utwórz połączenie HttpURLConnection z jakąś witryną, taką jak www.whatismyip.com, i przeanalizuj to :-)
źródło
Co powiesz na to? To proste i działało najlepiej dla mnie :)
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.MalformedURLException; import java.net.URL; public class IP { public static void main(String args[]) { new IP(); } public IP() { URL ipAdress; try { ipAdress = new URL("http://myexternalip.com/raw"); BufferedReader in = new BufferedReader(new InputStreamReader(ipAdress.openStream())); String ip = in.readLine(); System.out.println(ip); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
źródło
http://jstun.javawi.de/ zrobi to - pod warunkiem, że Twoje urządzenie bramy STUN))
źródło
Nie jest to takie proste, ponieważ maszyna w sieci LAN zwykle nie dba o zewnętrzny adres IP swojego routera do Internetu… po prostu go nie potrzebuje!
Sugeruję, abyś to wykorzystał, otwierając witrynę taką jak http://www.whatismyip.com/ i uzyskując numer IP, analizując wyniki HTML .. nie powinno być takie trudne!
źródło
Jeśli używasz aplikacji internetowej opartej na JAVA i chcesz pobrać zewnętrzny adres IP klienta (tego, który wysyła żądanie przez przeglądarkę), spróbuj wdrożyć aplikację w domenie publicznej i użyj request.getRemoteAddr () do odczytania zewnętrznego adresu IP.
źródło
System.out.println(pageCrawling.getHtmlFromURL("http://ipecho.net/plain"));
źródło
Alternatywnym rozwiązaniem jest wykonanie zewnętrznego polecenia, oczywiście takie rozwiązanie ogranicza przenośność aplikacji.
Na przykład w przypadku aplikacji działającej w systemie Windows polecenie PowerShell można wykonać za pomocą jPowershell, jak pokazano w poniższym kodzie:
public String getMyPublicIp() { // PowerShell command String command = "(Invoke-WebRequest ifconfig.me/ip).Content.Trim()"; String powerShellOut = PowerShell.executeSingleCommand(command).getCommandOutput(); // Connection failed if (powerShellOut.contains("InvalidOperation")) { powerShellOut = null; } return powerShellOut; }
źródło