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

 << zurück
Java ist auch eine Insel von Christian Ullenboom
Programmieren für die Java 2-Plattform in der Version 5
Java ist auch eine Insel

Java ist auch eine Insel
5., akt. und erw. Auflage
1454 S., mit CD, 49,90 Euro
Galileo Computing
ISBN 3-89842-747-1
gp Kapitel 16 Das Netz
  gp 16.1 Grundlegende Begriffe
    gp 16.1.1 Internet-Standards und RFC
  gp 16.2 URI und URL
    gp 16.2.1 URI
    gp 16.2.2 Die Klasse URL
    gp 16.2.3 Informationen über eine URL
    gp 16.2.4 Der Zugriff auf die Daten über die Klasse URL
    gp 16.2.5 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 und Proxy-Authentifizierung 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.6 NetworkInterface
  gp 16.7 Mit dem Socket zum Server
    gp 16.7.1 Das Netzwerk ist der Computer
    gp 16.7.2 Sockets
    gp 16.7.3 Standarddienste unter Windows nachinstallieren
    gp 16.7.4 Eine Verbindung zum Server aufbauen
    gp 16.7.5 Server unter Spannung: die Ströme
    gp 16.7.6 Die Verbindung wieder abbauen
    gp 16.7.7 Ein kleines Echo – lebt der Rechner noch?
    gp 16.7.8 Blockierendes Lesen
    gp 16.7.9 Informationen über den Socket
    gp 16.7.10 Mit telnet an den Ports horchen
    gp 16.7.11 Reine Verbindungsdaten über SocketAddress
  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 SSL-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.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, 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

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  static InetAddress[] getAllByName( String host ) throws UnknownHostException Wie getByName(), doch liefert es mehrere Objekte für den Fall, dass es zusätzliche Adressen gab.
gp  String getHostName() Liefert den Host-Namen.
gp  String getHostAddress() Liefert die IP-Adresse als String im Format »%d.%d.%d.%d«.
gp  String getCanonicalHostName() Liefert den voll qualifizierten Domönennamen (FQDN), wenn möglich.
gp  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«.


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

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.


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


Galileo Computing

16.5.3 IP-Adresse des lokalen Hosts  toptop

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

gp  static InetAddress getLocalHost() throws UnknownHostException Liefert ein IP-Adressen-Objekt des lokalen Hosts.
gp  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.

 << zurück




Copyright © Galileo Press GmbH 2005
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, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de