Galileo Computing < openbook >
Galileo Computing - Professionelle Buecher. Auch fuer Einsteiger.
Galileo Computing - Professionelle Buecher. Auch fuer Einsteiger.


Java ist auch eine Insel von Christian Ullenboom
Buch: Java ist auch eine Insel (Galileo Computing)
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 Im Detail: vom URL zu URLConnection
gp 16.3.4 Autorisierte URL-Verbindungen mit Basic Authentication
gp 16.3.5 Apache Jakarta HttpClient
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 Das Netz ist Klasse ...
gp 16.5.2 IP-Adresse des lokalen Hosts
gp 16.5.3 Die Methode getAllByName()
gp 16.6 NetworkInterface
gp 16.7 IPv6 für Java mit Jipsy
gp 16.8 Socket-Programmierung
gp 16.8.1 Das Netzwerk ist der Computer
gp 16.8.2 Standarddienste unter Windows nachinstallieren
gp 16.8.3 Stream-Sockets
gp 16.8.4 Informationen über den Socket
gp 16.8.5 Mit telnet an den Ports horchen
gp 16.8.6 Ein kleines Echo - lebt der Rechner noch?
gp 16.9 Client/Server-Kommunikation
gp 16.9.1 Warten auf Verbindungen
gp 16.9.2 Ein Multiplikations-Server
gp 16.10 SLL-Verbindungen mit JSSE
gp 16.11 Web-Protokolle mit NetComponents nutzen
gp 16.12 E-Mail
gp 16.12.1 Wie eine E-Mail um die Welt geht
gp 16.12.2 Übertragungsprotokolle
gp 16.12.3 Das Simple Mail Transfer Protocol
gp 16.12.4 E-Mails versenden mit Suns JavaMail-API
gp 16.12.5 MimeMultipart-Nachrichten schicken
gp 16.12.6 E-Mails mittels POP3 abrufen
gp 16.13 Arbeitsweise eines Web-Servers
gp 16.13.1 Das Hypertext Transfer Protocol (HTTP)
gp 16.13.2 Anfragen an den Server
gp 16.13.3 Die Antworten vom Server
gp 16.14 Datagram-Sockets
gp 16.14.1 Die Klasse DatagramSocket
gp 16.14.2 Datagramme und die Klasse DatagramPacket
gp 16.14.3 Auf ein hereinkommendes Paket warten
gp 16.14.4 Ein Paket zum Senden vorbereiten
gp 16.14.5 Methoden der Klasse DatagramPacket
gp 16.14.6 Das Paket senden
gp 16.14.7 Die Zeitdienste und ein eigener Server und Client
gp 16.15 Internet Control Message Protocol (ICMP)
gp 16.15.1 Ping
gp 16.16 Multicast-Kommunikation


Galileo Computing

16.5 Host- und IP-Adressendowntop

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.

Abbildung
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
  }
}

Galileo Computing

16.5.1 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.2 IP-Adresse des lokalen Hostsdowntop

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

gp String getHostName()
Liefert den Host-Namen.
gp String getHostAddress()
Liefert die IP-Adresse als String im Format »%d.%d.%d.%d«.
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 getLocalHost() throws UnknownHostException
Liefert ein IP-Adressen-Objekt des lokalen Hosts.

Galileo Computing

16.5.3 Die Methode getAllByName()toptop

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.





Copyright (c) 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