11.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.
Abbildung 11.7: Vererbungsbeziehung von InetAddress und Unterklassen
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 Fabrikmethoden wie getByName() oder getAllByName() erzeugt. Gebotene getXXX()-Methoden erfragen dann Resultate, die die Auflösung ergeben hat:
Listing 11.9: 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 |
- 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), sofern das möglich ist. - byte[] getAddress()
Gibt ein Feld mit Oktetten – der Internetbezeichnung für Bytes – für die IP-Adresse zurück.
11.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.
11.5.2 IP-Adresse des lokalen Hosts
Auch dazu benutzen wir die Klasse InetAddress. Sie besitzt die statische Methode getLocalHost().
Listing 11.10: 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 |
- 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 Methode 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 Methode InetAddress.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 eines 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.de/go/netproperties. |
11.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 = ...
boolean isDNet = (ia.getBytes()[0] & 0xF0) == 0xE0;
Für den speziellen Fall einer Multicast-Adresse bietet InetAddress auch die Methode isMulticastAddress() an.
11.5.4 NetworkInterface
Die Klasse java.net.NetworkInterface repräsentiert eine Netzwerkschnittstelle und mit ihr einen Namen und eine Reihe von IP-Adressen. Mithilfe der Klasse ist es möglich, alle IP-Adressen des lokalen Rechners auszulesen. Das folgende Beispiel soll die Methoden der Klasse demonstrieren:
Listing 11.11: com/tutego/insel/net/LocalIpAddress.java, main()
Enumeration<NetworkInterface> netInter = NetworkInterface.getNetworkInterfaces();
int n = 0;
while ( netInter.hasMoreElements() )
{
NetworkInterface ni = netInter.nextElement();
System.out.println( "NetworkInterface " + n++ + ": " + ni.getDisplayName() );
for ( InetAddress iaddress : Collections.list(ni.getInetAddresses()) )
{
System.out.println( "CanonicalHostName: " +
iaddress.getCanonicalHostName() );
System.out.println( "IP: " +
iaddress.getHostAddress() );
System.out.println( "Loopback? " +
iaddress.isLoopbackAddress() );
System.out.println( "SiteLocal? " +
iaddress.isSiteLocalAddress() );
System.out.println();
}
}
Auf meinem Rechner, der sich hinter einem Router befindet, ergibt sich:
NetworkInterface 0: MS TCP Loopback interface
CanonicalHostName: localhost
IP: 127.0.0.1
Loopback? true
SiteLocal? false
NetworkInterface 1: Intel(R) PRO/1000 PL Network Connection – Paketplaner-Miniport
CanonicalHostName: dell
IP: 192.168.2.138
Loopback? false
SiteLocal? true
Ihr Kommentar
Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.