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, und daher findet oft der Host-Name Verwendung, 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 – soweit 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()-Funktion 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. |
|
String getHostName()
Liefert den Host-Namen. |
|
String getHostAddress()
Liefert die IP-Adresse als String im Format »%d.%d.%d.%d«. |
|
byte[] getAddress()
Gibt das Feld mit Oktetten – die Internetbezeichung für Byte – für die IP-Adresse zurück. |
Listing 16.7
MyDNS.java
import java.net.*;
public class MyDNS
{
public static void main( String args[] ) throws Exception
{
InetAddress inet = InetAddress.getByName( "java-tutor.com" );
System.out.println( inet.getCanonicalHostName() ); // 66.70.168.193
System.out.println( inet.getHostAddress() ); // 66.70.168.193
System.out.println( inet.getHostName() ); // java-tutor.com
System.out.println( inet.toString() );
// java-tutor.com/66.70.168.193
}
}
 Hier klicken, um das Bild zu Vergrößern
Das Schöne ist, dass anstelle des Rechnernamens auch die IP-Adresse angegeben werden kann und dann getHostName() eine umgekehrte Auflösung vornimmt. 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
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 Bits 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 wieder die Klasse InetAddress. Sie besitzt die statische Funktion getLocalHost().
Beispiel Ermitteln der eigenen IP-Adresse
Listing 16.8
GetLocalIP.java
import java.net.*;
class GetLocalIP
{
public static void main( String args[] )
{
try {
System.out.println( "Host Name und Adresse: " +
InetAddress.getLocalHost());
}
catch( Exception e ) { System.out.println( e ); }
}
}
|
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
class java.net. InetAddress
implements Serializable
|
|
static InetAddress getLocalHost() throws UnknownHostException
Liefert ein IP-Adressen-Objekt des lokalen Hosts. |
16.5.4 Die Methode getAllByName()
 
Die Klasse InetAddress bietet die statische Funktion getLocalHost() an, um die eigene Adresse herauszufinden. Mit ein paar wenigen Zeilen lässt sich dann bei mehreren vergebenen IP-Adressen des Rechners alles ausgeben. Dazu lässt sich die statische Funktion getAllByName() nutzen, die alle InetAddress-Objekte liefert, die mit einem Rechner verbunden sind. Nutzen wir das, um alle IP-Adressen des eigenen Rechners auszugeben:
Listing 16.9
GetAllByName.java
import java.net.*;
import java.util.*;
public class GetAllByName
{
public static void main( String args[] ) throws UnknownHostException
{
InetAddress ia[] = InetAddress.getAllByName(
InetAddress.getLocalHost().getHostName() );
System.out.println( Arrays.asList(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 networkaddress.cache.ttl gesetzt. Mehr zu den Netzwerk-Properties bietet wieder die Seite http://java.sun.com/j2se/1.5.0/docs/guide/net/properties.html.
|
|