Previous Contents Next

11   Networking

Inhalt Internetadressierung ·Sockets und Ports ·Client/Server-Programmierung ·Multicasting ·höhere Netzdienste
Literatur: Das relevante API Paket ist java.net; für remote method invocation java.rmi.*. Material und Beispiele zum Thema findet sich in Kapitel 9 von [Fla97a] sowie in Kapitel 15 von [Eck98]. Auch der entsprechende Abschnitt aus dem Tutorial [CW96] ist als Einstieg brauchbar. Darüberhinaus gibt es noch [Har97] nur über Netzwerkprogrammierung, aber ich kenne es selbst nicht. Ein wenig über die verschiedenen Internetprotokolle habe ich aus [Tan96].
IP-Adressen & Ports
Beispiel 29  [Adresse]   Mittels statischer Methoden der Klasse InetAddress kann man die TCP/IP-DNS-Adreßdienste nutzen. Instanzen von InetAddress sind IP-Adressen (allerdings hat die Klasse keinen Konstruktor, verwendet für Sockets, ...).

import java.net.*;

public class NSLookup {  // einfache DNS-Anfrage 
  public static void main(String[] args) throws Exception {
    if (args.length != 1) {
      System.err.println("Usage: NSLookup machine");
      System.exit(0);              //
    };
    InetAddress la = InetAddress.getLocalHost();
    InetAddress a =  InetAddress.getByName(args[0]);
    System.out.println(a);
    System.out.println("Lokaler Host: " + la);
  };

};
  
  


Sockets
Client/Servers


Beispiel 30  [Server]   Ein einfacher statischer Server, der einen Socket aufmacht und zeilenweise Zeichen liest.

import java.io.*;
import java.net.*;
public class Server {
  public static final int PORT = 2000;    // Portnummer
  public static void main (String[] args) throws IOException {
    ServerSocket s = new ServerSocket(PORT);
    System.out.println("Started: " + s);
    try {
      Socket socket = s.accept(); // Beginn der Bereitschaft
      try {
        System.out.println("Connection accepted:" + socket);
        BufferedReader in =
          new BufferedReader(
            new InputStreamReader(socket.getInputStream()));

        PrintWriter out = 
          new PrintWriter(
            new BufferedWriter(
              new OutputStreamWriter(socket.getOutputStream())), 
            true);                      // autoflush=on for println

        while (true) {                  // Lesen bis "END"
          String str  = in.readLine();  // zeilenweises Lesen
          if (str.equals("END")) break; // Abbruch
          System.out.println("Echoing: " + str); // R"uckkanal
          out.println("Echoing: " + str);        // Echo -> stdout
        }; }
      finally {
        System.out.println("closing ..");
        socket.close();
      }}
    finally {s.close();}};
};


Beispiel 31  [Client]   Hier der zu dem Server aus Beispiel 30 auf Folie ?? passende Klient.

import java.net.*;
import java.io.*;
public class SingleClient {
  public static void main (String[] args) throws IOException {
    InetAddress addr = InetAddress.getByName(null);  // null = local host
    System.out.println("addr = " + addr);

    Socket socket = new Socket (addr, SingleServer.PORT);
    try {
      System.out.println("socket = " + socket);
      BufferedReader in = 
        new BufferedReader(
          new InputStreamReader (socket.getInputStream()));
      PrintWriter out =
        new PrintWriter(
          new BufferedWriter(
            new OutputStreamWriter(socket.getOutputStream())), 
          true);
      
      for (int i = 0; i< 10; i++){
        out.println("Hello World" + i);
        String str = in.readLine();
        System.out.println(str);
      };
      out.println("END");
    } finally {
      System.out.println("closing...");
      socket.close();
    }
  };
};


Mehrere Klienten
Beispiel 32  [Server]   Hier der entsprechende Code.

import java.io.*;
import java.net.*;

public class MultiServer {          // Startet die Unterthreads
  public static final int PORT = 2000;
  public static void main(String[] args) 
    throws IOException {
    ServerSocket s = new ServerSocket(PORT);  // Zum Horchen
    System.out.println("Started: " + s);
    try {
      while (true) {                         // Soviele wie verlangt
        Socket socket = s.accept();
        try {
          new ServeOne(socket);              // socket als Param.
        } catch (IOException e) {
          socket.close();
        };
      };
    }
    finally {s.close();};
  };
};



Beispiel 33  [Server]   Hier ein einzelner Serverprozeß. Er bekommt den Socket den er bedienen soll, als Parameter. Ansonsten analog zum Server aus Beispiel 30.

import java.io.*;
import java.net.*;


public class ServeOne extends Thread {
  private Socket socket;
  private BufferedReader in;
  private PrintWriter out;

  public ServeOne (Socket s) throws IOException  { 
    // Socket als Parameter
    socket = s;
    BufferedReader in =           // genau vor vorher
      new BufferedReader(
        new InputStreamReader(socket.getInputStream()));
    
    PrintWriter out =             // ganau wie vorher
      new PrintWriter(
        new BufferedWriter(
          new OutputStreamWriter(socket.getOutputStream())), 
        true);
    
    start();                      // ruft run() auf
  };

  public void run () {            // "Uberschreiben der run-Methode
    try {
      while (true) {              // Loop
        String str = in.readLine();
        if (str.equals("END")) break;
        System.out.println("Echoing: " + str);
        out.println(str);
      };
      
      System.out.println("closing ..");
    } catch (IOException e) {
    } finally {
      try {
        socket.close();
      } catch (IOException  e) {}
    };
  };
};


        


Beispiel 34  [Klienten]   Der Vollständigkeit halber noch das selbe für Klientenseite. Hier der Prozeß, der alle Klienten erzeugt:

import java.net.*;
import java.io.*;


public class ManyClients {
  static final int MAX_THREADS = 4;
  public static void main(String[] args) 
    throws IOException, InterruptedException {
    InetAddress addr = InetAddress.getByName(null); //
    while (true) {
      if (OneClient.threadCount() < MAX_THREADS)
 new OneClient(addr);
      Thread.currentThread().sleep(1000);
    };
  };
};


Beispiel 35  [Ein Klient]   Schließlich ein einzelner Klient, der Code ist nicht wesentlich anders als zuvor:

import java.net.*;
import java.io.*;

public class OneClient extends Thread{
  private Socket socket;
  private BufferedReader in;
  private PrintWriter out;
  private static int counter  = 0;
  private int id = counter++;
  private static int threadcount = 0;
  public static int threadCount() {
    return threadcount;
  };
  
  public OneClient(InetAddress addr) {
    System.out.println("Neuer Klient @ " + id);
    threadcount++;
    try {
      socket = new Socket(addr, MultiServer.PORT); //stat. Adresse
    } catch (IOException e) {}                
    try {
      in =
        new BufferedReader(
          new InputStreamReader (socket.getInputStream()));
      out =
        new PrintWriter(
          new BufferedWriter(
            new OutputStreamWriter(socket.getOutputStream())), 
          true);
      
      start();                        // starte Thread -> run
    } catch (IOException e) {
      try {
        socket.close();
      } catch (IOException e2) {}
    };
  };

  public void run() {
    try{
      for (int i = 0; i< 25; i++){
        out.println("Client"  + id + ": " + i );
        String str = in.readLine();
        System.out.println(str);
      };
      out.println("END");
    } catch (IOException e) {
    } finally {
      try {
        socket.close();
      } catch (IOException e) {}
      threadcount--;
    };
  };
};

e

Datagrammdienste


Multicasting


Höhere Dienste: URL
URL: Zusammenfassung

Protokoll Verwendung Beispiel
http Hypertext (HTML) http://www.informatik.uni-kiel.de/~ms
ftp File transfer ftp://ftp.informatik.uni-kiel.de/pub/kiel/
file lokale Datei /home/ms/.plan
news Brett/Artikel
news:cau.ifi.fragen
news:AA4534345@news.informatik.uni-kiel.de
gopher Gopher gopher://gopher.informatik.tu-muenchen.de/
mailto Email mailto:ms@informatik.uni-kiel.de
telnet Einloggen telnet://snoopy.informatik.uni-kiel.de:80

Table 10: Verschiedene URL's


Url-Verbindungen


July 4, 2000
Previous Contents Next