16.5 Host- und IP-Adressen
 
Der Datenaustausch im Internet geschieht durch kleine IP-Pakete. Sie bilden die Basis der Internetübertragung. Immer dann, 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, der numerischen 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, für den Rechnernamen die IP-Adresse 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.
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 (»java-tutor.com«) oder numerische Repräsentation der IP-Adresse (»66.70.168.193«) beschrieben sein. |
|
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 möglich. |
|
byte[] getAddress()
Gibt ein Feld mit Oktetten – die Internetbezeichung für Byte – für die IP-Adresse zurück. |
Listing 16.7
com/javatutor/insel/net/MyDNS.java
package com.javatutor.insel.net;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class MyDNS
{
public static void main( String[] args ) throws UnknownHostException
{
InetAddress inet = InetAddress.getByName( "java-tutor.com" );
System.out.println( inet.getCanonicalHostName() ); // sites.networkaholics.de
System.out.println( inet.getHostAddress() ); // 82.96.75.60
System.out.println( inet.getHostName() ); // java-tutor.com
System.out.println( inet.toString() ); // java-tutor.com/82.96.75.60
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«.
16.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 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. Denn kann der Namensdienst den symbolischen Namen nicht auflösen, wird er auch einen Fehler melden, der nichts mit der Erreichbarkeit zu tun hat.
16.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.
16.5.3 IP-Adresse des lokalen Hosts
 
Auch dazu benutzen wir die Klasse InetAddress. Sie besitzt die statische Funktion getLocalHost().
Beispiel Ermitteln der eigenen IP-Adresse
Listing 16.8
com/javatutor/insel/net/GetLocalIP.java
package com.javatutor.insel.net;
import java.net.*;
class GetLocalIP
{
public static void main( String[] args ) throws Exception
{
System.out.println( "Host Name/Adresse: " + InetAddress.getLocalHost() );
}
}
|
Das Programm erzeugt auf zwei Rechnern eine Ausgabe der folgenden Art:
Host Name und Adresse: schnecke/192.10.10.2
Host Name und Adresse: lisa/127.0.0.1
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 );
Hinweis Läuft ein Java-Programm, und die IP-Adresse des Rechners wird 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://java.sun.com/j2se/1.5/docs/guide/net/properties.html.
|
|