17.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 Host-Name Verwendung findet, um einen Rechner im Internet anzusprechen. Die Konvertierung von Host-Namen 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 die Fabrik-Funktionen wie getByName() oder getAllByName() erzeugt. Gebotene getXXX()-Funktionen erfragen dann Resultate, die die Auflösung gegeben hat.
Listing 17.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 aufgrund des Namens. Der Host-Name kann als Maschinenname (»tutego.com«) angegenben 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 Host-Namen.
- 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.
17.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.
17.5.2 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.
17.5.3 IP-Adresse des lokalen Hosts 

Auch dazu benutzen wir die Klasse InetAddress. Sie besitzt die statische Funktion getLocalHost().
Listing 17.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 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 statische 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 );
|