Na ogół korzystamy z rutera. Komputery podpięte do rutera otrzymują wewnętrzne nr IP. Te numery nadaje ruter. Na ogół są dynamiczne. Na ogół można je zamienić na statyczne z poziomu rutera.
Numer pod, którym ruter jest widoczny w sieci nazywany jest zewnętrznym IP. Ten numer nadaje operator sieci. Ten numer niemal zawsze jest dynamiczny. O tym czy można uzyskać stały nr IP decyduje operator sieci.
Powstaje pytanie jak znaleźć te nr IP używając języka Java.
Wewnętrzny IP
Znalezienie numeru jest wyjątkowo proste.
String localip = null; try { localip = Inet4Address.getLocalHost().getHostAddress(); } catch (UnknownHostException e) { Logger.getLogger(MyIP.class.getName()).log(Level.ALL, e.getLocalizedMessage()); } System.out.println("Local IP Address: " + localip);
Po uruchomieniu na moim komputerze otrzymuję:
Local IP Address: 192.168.1.13
Zewnętrzny IP
Tego numeru nie można ustalić bez pomocy z zewnątrz. Istnieją różne strony, które po ich wczytaniu zwracają nr IP komputera, który się z nimi połączył. Numer jest prawdziwy, o ile nie łączysz się spoza zasłony VPN. Ja znam tylko jeden taki adres, ale możesz samodzielnie wypróbować inne.
String publicip = null; try { URL url = new URL("https://api4.ipify.org/?format=text&callback=getIP"); BufferedReader sc = new BufferedReader(new InputStreamReader(url.openStream())); publicip = sc.readLine().trim(); } catch (Exception e) { Logger.getLogger(MyIP.class.getName()).log(Level.ALL, e.getLocalizedMessage()); } System.out.println("Public IP Address: " + publicip);
Ja po użyciu tego kodu otrzymałem nr;
Public IP Address: 79.184.238.43
Jest to numer pod jakim w tej chwili widoczny jest mój FunBox 3.0.
Oczywiście warto by znać kilka adresów takich stron i stosować je wymiennie, na wypadek gdyby jedna z nich była w danej chwili niedostępna.
Jeśli zamiast IP4 chciałbyś uzyskać nr IP6 zmień w kodzie 'api4′ na 'api6′.
Klasa
package mydynserv; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.*; import java.util.logging.Level; import java.util.logging.Logger; public class MyIP { public static void main(String[] args) { String localip = null; try { localip = Inet4Address.getLocalHost().getHostAddress(); } catch (UnknownHostException e) { Logger.getLogger(MyIP.class.getName()).log(Level.ALL, e.getLocalizedMessage()); } System.out.println("Local IP Address: " + localip); String publicip = null; try { URL url = new URL("https://api4.ipify.org/?format=text&callback=getIP"); BufferedReader sc = new BufferedReader(new InputStreamReader(url.openStream())); publicip = sc.readLine().trim(); } catch (Exception e) { Logger.getLogger(MyIP.class.getName()).log(Level.ALL, e.getLocalizedMessage()); } System.out.println("Public IP Address: " + publicip); } }