Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger

Java ist auch eine Insel von Christian Ullenboom
Programmieren für die Java 2-Plattform in der Version 5 (Tiger-Release)
Buch: Java ist auch eine Insel
gp Kapitel 16 Netzwerkprogrammierung
  gp 16.1 Grundlegende Begriffe
    gp 16.1.1 Internet-Standards und RFC
  gp 16.2 URL-Verbindungen und URL-Objekte
    gp 16.2.1 Die Klasse URL
    gp 16.2.2 Informationen über eine URL
    gp 16.2.3 Der Zugriff auf die Daten über die Klasse URL
    gp 16.2.4 Verbindungen durch einen Proxy-Server
  gp 16.3 Die Klasse URLConnection
    gp 16.3.1 Methoden und Anwendung von URLConnection
    gp 16.3.2 Protokoll- und Content-Handler
    gp 16.3.3 Bilder-Handler
    gp 16.3.4 Zusammenfassung Content- und Protokoll-Handler
    gp 16.3.5 Im Detail: vom URL zu URLConnection
    gp 16.3.6 Der Protokoll-Handler für Jar-Dateien
    gp 16.3.7 Autorisierte URL-Verbindungen mit Basic Authentication
  gp 16.4 Das Common Gateway Interface
    gp 16.4.1 Parameter für ein CGI-Programm
    gp 16.4.2 Kodieren der Parameter für CGI-Programme
    gp 16.4.3 Eine Suchmaschine ansprechen
  gp 16.5 Host- und IP-Adressen
    gp 16.5.1 Lebt der Rechner?
    gp 16.5.2 Das Netz ist Klasse …
    gp 16.5.3 IP-Adresse des lokalen Hosts
    gp 16.5.4 Die Methode getAllByName()
  gp 16.6 NetworkInterface
  gp 16.7 Mit dem Socket zum Server
    gp 16.7.1 Das Netzwerk ist der Computer
    gp 16.7.2 Standarddienste unter Windows nachinstallieren
    gp 16.7.3 Eine Verbindung zum Server aufbauen
    gp 16.7.4 Server unter Spannung: die Ströme
    gp 16.7.5 Die Verbindung wieder abbauen
    gp 16.7.6 Ein kleines Echo – lebt der Rechner noch?
    gp 16.7.7 Blockierendes Lesen
    gp 16.7.8 Informationen über den Socket
    gp 16.7.9 Mit telnet an den Ports horchen
  gp 16.8 Client/Server-Kommunikation
    gp 16.8.1 Warten auf Verbindungen
    gp 16.8.2 Ein Multiplikations-Server
    gp 16.8.3 Von außen erreichbar sein
  gp 16.9 SLL-Verbindungen mit JSSE
  gp 16.10 Apache Jakarta Commons HttpClient und Net
    gp 16.10.1 Jakarta Commons HttpClient
    gp 16.10.2 Jakarta Commons Net
  gp 16.11 E-Mail
    gp 16.11.1 Wie eine E-Mail um die Welt geht
    gp 16.11.2 Das Simple Mail Transfer Protocol und RFC 822
    gp 16.11.3 POP (Post Office Protocol)
    gp 16.11.4 E-Mails versenden mit der JavaMail API von SUN
    gp 16.11.5 MimeMultipart-Nachrichten schicken
    gp 16.11.6 E-Mails mittels POP3 abrufen
    gp 16.11.7 Ereignisse und Suchen
  gp 16.12 Arbeitsweise eines Web-Servers
    gp 16.12.1 Das Hypertext Transfer Protocol (HTTP)
    gp 16.12.2 Anfragen an den Server
    gp 16.12.3 Die Antworten vom Server
  gp 16.13 Datagram-Sockets
    gp 16.13.1 Die Klasse DatagramSocket
    gp 16.13.2 Datagramme und die Klasse DatagramPacket
    gp 16.13.3 Auf ein hereinkommendes Paket warten
    gp 16.13.4 Ein Paket zum Senden vorbereiten
    gp 16.13.5 Methoden der Klasse DatagramPacket
    gp 16.13.6 Das Paket senden
    gp 16.13.7 Die Zeitdienste und ein eigener Server und Client
  gp 16.14 Tiefer liegende Netzwerkeigenschaften
    gp 16.14.1 Internet Control Message Protocol (ICMP)
    gp 16.14.2 MAC-Adresse
  gp 16.15 Multicast-Kommunikation


Galileo Computing

16.5 Host- und IP-Adressen  downtop

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

gp  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.
gp  String getHostName()
Liefert den Host-Namen.
gp  String getHostAddress()
Liefert die IP-Adresse als String im Format »%d.%d.%d.%d«.
gp  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
  }
}

Abbildung
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«.


Galileo Computing

16.5.1 Lebt der Rechner?  downtop

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

Galileo Computing

16.5.2 Das Netz ist Klasse …  downtop

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.


Galileo Computing

16.5.3 IP-Adresse des lokalen Hosts  downtop

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

gp  static InetAddress getLocalHost() throws UnknownHostException
Liefert ein IP-Adressen-Objekt des lokalen Hosts.

Galileo Computing

16.5.4 Die Methode getAllByName()  toptop

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.





Copyright © Galileo Press GmbH 2004
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press GmbH, Gartenstraße 24, 53229 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de