Zielony Smok - logo witryny

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);
    }
}