18.5 Host- und IP-Adressen 

Der Datenaustausch im Internet geschieht durch kleine IP-Pakete. Sie bilden die Basis der Internetübertragung. Immer wenn ein Netzwerkpaket übermittelt werden soll, werden IP-Pakete erzeugt und dann auf die Reise geschickt. Der Empfänger der Pakete ist ein Rechner, der im Netz durch eine Kennung, die numerische IP-Adresse, identifiziert wird. Diese Zahl ist für die meisten Menschen schwer zu behalten, weshalb oft der Hostname Verwendung findet, um einen Rechner im Internet anzusprechen. Die Konvertierung von Hostnamen in IP-Adressen übernimmt ein Domain Name Server (DNS). Baut eine Anwendung – etwa ein Internet-Browser – eine Verbindung zu einem Rechner auf, so hilft eine Betriebssystemfunktion, die IP-Adresse für den Rechnernamen zu ermitteln. An diese Adresse kann dann im nächsten Schritt eine Webanfrage gestellt werden.
Auch wir können in Java zu einem Namen die IP-Adresse erfragen und auch umgekehrt vorgehen und zu einer IP-Adresse den Rechnernamen erfragen – sofern verfügbar. Die Anweisungen laufen über die Klasse InetAddress, die eine Internet-Adresse repräsentiert. Das Objekt wird durch Fabrikfunktionen wie getByName() oder getAllByName() erzeugt. Gebotene getXXX()-Methoden erfragen dann Resultate, die die Auflösung gegeben hat.
Listing 18.8 com/tutego/insel/net/MyDNS.java
InetAddress inet = InetAddress.getByName( "www.tutego.com" ); System.out.println( inet.getCanonicalHostName() ); // web1.networkaholics.de System.out.println( inet.getHostAddress() ); // 82.96.100.30 System.out.println( inet.getHostName() ); // www.tutego.com System.out.println( inet.toString() ); // www.tutego.com/82.96.100.30 inet = InetAddress.getByName( "193.99.144.71" ); System.out.println( inet.getHostName() ); // web.heise.de
Erfreulicherweise ist es möglich, anstelle des Rechnernamens auch die IP-Adresse anzugeben; getHostName() nimmt dann eine umgekehrte Auflösung vor. So liefert InetAddress.getByName("193.99.144.71").getHostName() den String »www.heise.de«.
class java.net.InetAddress
implements Serializable |
- static InetAddress getByName( String host ) throws UnknownHostException
Liefert die IP-Adresse eines Hosts anhand des Namens. Der Hostname kann als Maschinenname (»tutego.com«) angegeben sein oder als numerische Repräsentation der IP-Adresse (»66.70.168.193«).
- static InetAddress[] getAllByName( String host ) throws UnknownHostException
Wie getByName(), doch liefert es mehrere Objekte für den Fall, dass es zusätzliche Adressen gab.
- String getHostName()
Liefert den Hostnamen.
- String getHostAddress()
Liefert die IP-Adresse als String im Format »%d.%d.%d.%d«.
- String getCanonicalHostName()
Liefert den voll qualifizierten Domänennamen (FQDN), wenn das möglich ist.
- byte[] getAddress()
Gibt ein Feld mit Oktetten – die Internetbezeichnung für Bytes – für die IP-Adresse zurück.
18.5.1 Lebt der Rechner? 

Verwaltet das InetAddress-Objekt einen Rechnernamen, so kann das Objekt durch Versenden von Test-Paketen überprüfen, ob der Rechner im Internet »lebt«. Dazu dient isReachable(); das Argument ist eine Anzahl von Millisekunden, die wir dem Prüfvorgang geben wollen.
InetAddress.getByName( "193.99.144.71" ).isReachable( 2000 ) // true InetAddress.getByName( "100.100.100.100" ).isReachable( 2000 ) // false
Um Probleme mit der Namensauflösung auszuschließen, sollte die IP-Adresse verwendet werden, da der Namensdienst einen Fehler melden wird, der nichts mit der Erreichbarkeit zu tun hat, falls er den symbolischen Namen nicht auflösen kann.
18.5.2 IP-Adresse des lokalen Hosts 

Auch dazu benutzen wir die Klasse InetAddress. Sie besitzt die statische Funktion getLocalHost().
Listing 18.9 com/tutego/insel/net/GetLocalIP.java, main()
System.out.println( "Host Name/Adresse: " + InetAddress.getLocalHost() );
Das Programm erzeugt zum Beispiel eine Ausgabe der folgenden Art:
Host Name/Adresse: dell/192.168.2.138
Apropos lokaler Rechner: Die Methode isSiteLocalAddress() liefert true, wenn das InetAddress-Objekt für den eigenen Rechner steht, also eine IP-Adresse wie 192.168.0.0 hat.
class java.net.InetAddress
implements Serializable |
- static InetAddress getLocalHost() throws UnknownHostException
Liefert ein IP-Adressen-Objekt des lokalen Hosts.
- boolean isSiteLocalAddress()
Repräsentiert diese InetAddress eine lokale Adresse?
Die statische Methode getAllByName()
Die Klasse InetAddress bietet die statische Funktion getLocalHost() an, um die eigene Adresse herauszufinden. Bei mehreren vergebenen IP-Adressen des Rechners lässt sich dann mit einigen wenigen Zeilen alles ausgeben. Dazu lässt sich die Funktion getAllByName() nutzen, die alle mit einem Rechner verbundenen InetAddress-Objekte liefert.
String localHost = InetAddress.getLocalHost().getHostName(); for ( InetAddress ia : InetAddress.getAllByName(localHost) ) System.out.println( ia );
Hinweis Läuft ein Java-Programm und wird die IP-Adresse des Rechners geändert, dann wird Java diese Änderung nicht registrieren. Das liegt daran, dass alle IP-Adressen und zugehörigen Host-Adressen in einem internen Cache gehalten werden. Eine neue Anfrage wird dann einen Cache-Eintrag liefern, aber zu keiner neuen Anfrage an das Betriebssystem führen. Seit Version 1.4 gibt es eine Möglichkeit, die Lebensdauer einer IP-Adresse auf null zu setzen. Dazu wird die Property network-address.cache.ttl gesetzt. Mehr zu den Netzwerk-Properties bietet wieder die Seite http://tutego.com/go/netproperties. |
18.5.3 Das Netz ist Klasse … 

Mit der getBytes()-Methode aus der Klasse InetAddress lässt sich leicht herausfinden, welches Netz die Adresse beschreibt. Für ein Multicast-Socket ist die Internet-Adresse ein Klasse-D-Netz. Dieses beginnt mit den vier Bit 1110, hexadezimal 0xE0. Folgende Zeilen fragen dies für eine beliebige InetAddress ab:
InetAddress ia = ... if ( (ia.getBytes()[0] & 0xF0) == 0xE0 ) { // Klasse D Netz ... }
Für den speziellen Fall einer Multicast-Adresse bietet InetAddress auch die Methode isMulticastAddress() an.