16.5 Host- und IP-Adressen
Ziehen Pakete durch das Internet, so orientieren sie sich an der numerischen IP-Adresse. Diese 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). Seine Funktionalität ist durch eine Java-Funktion nutzbar. Die zu nutzende Methode ist getHostName(). Die folgende Zeile ist eine gültige Programmanweisung, um zur IP-Adresse den Host-Namen zu erfragen:
String h = InetAddress.getByName("194.64.249.245").getHostName(); // www.spiegel.de
Die Klasse InetAddress repräsentiert eine IP-Adresse. Das Objekt wird durch die Funktionen getLocalHost(), getByName() oder getAllByName() erzeugt.
Das folgende Programm liefert ein Bytefeld und gibt die Oktette der IP-Adresse aus. Oktette ist der Internet-Begriff für ein Byte.
Hier klicken, um das Bild zu Vergrößern
Listing 16.8 MyDNS.java
import java.net.*;
public class MyDNS
{
public static void main( String args[] ) throws Exception
{
String adress = "java-tutor.com";
InetAddress inet = InetAddress.getByName( adress );
byte ip[] = inet.getAddress();
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
}
}
16.5.1 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.2 IP-Adresse des lokalen Hosts
Auch dazu benutzen wir wieder die Klasse InetAddress. Sie besitzt die statische Methode getLocalHost().
Beispiel Ermitteln der eigenen IP-Adresse
Listing 16.9 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
|
|
String getHostName()
Liefert den Host-Namen. |
|
String getHostAddress()
Liefert die IP-Adresse als String im Format »%d.%d.%d.%d«. |
|
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 getLocalHost() throws UnknownHostException
Liefert ein IP-Adressen-Objekt des lokalen Hosts. |
16.5.3 Die Methode getAllByName()
Die Klasse InetAddress bietet die statische Methode 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 Methode 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.10 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 die Seite http://java.sun.com/j2se/1.4/docs/guide/net/properties.html.
|
|