Client/Server

Herli

Mitglied
Hallo Leute!

Ich habe folgendes Problem:
Das Beispiel stanmmt aus einem Buch, sollte deswegen auch kunktionieren Alle drei Klassen compilieren ohne Fehler. Der Server stürzt nicht ab (java DateTimeServer 2222).
Der Client bricht jedoch nach 2 Sekunden wie der zusammen, weil er den DNS Eintrag nicht findet: Ich starte mit java MyClient localhost, 2222.

Hier der Quellcode:
Code:
import java.io.*;
import java.net.*;

class DateTimeServer{
      public static void main(String[] args) {
            try {
              int port = Integer.parseInt(args[0]);         //Port-Nummer
              ServerSocket server = new ServerSocket(port); //Server-Socket
              System.out.println("DateTimeServer läuft");   //Statusmeldung
              while (true) {
                Socket s = server.accept();                 //Client-Verbindung akzeptieren
                new DateTimeDienst(s).start();              //Dienst starten
              }
            }
            catch (ArrayIndexOutOfBoundsException ae) {
              System.out.println("Aufruf: java DateTimeServer <Port-Nummer>");
            }
            catch (IOException e) {
              e.printStackTrace();
            }
      }
}

Code:
import java.io.*;
import java.net.*;
import java.util.*;
import java.text.*;

class DateTimeDienst extends Thread {
   static SimpleDateFormat           //Formate für den Zeitpunkt
          time = new SimpleDateFormat("Es ist gerade 'H'.'mm' Uhr."),
          date = new SimpleDateFormat("Heute ist 'EEEE', der 'dd.MM.yy");
   static int anzahl = 0;            //Anzahl der Clients insgesamt
   int nr = 0;                       //Nummer der Clients
   Socket s;                         //Socket in Verbindung mit dem Client
   BufferedReader vomClient;         //Eingabe-Strom vom Client
   PrintWriter zumClient;            //Ausgabe-Strom zum Client
   
   public DateTimeDienst(Socket s) { //Konstruktor
     try {
       this.s = s;
       nr = ++anzahl;
       vomClient = new BufferedReader(
                       new InputStreamReader(
                           s.getInputStream()));
       zumClient = new PrintWriter (
                       s.getOutputStream(),true);
     }
     catch (IOException e) {
       System.out.println("IO-Error bei Client " + nr);
     }
   }
   
   public void run () {             //Methode die das Protokollabwickelt
     System.out.println("Protokoll fuer Client " + nr + " gestartet");
     try{
       while (true) {
              zumClient.println("Geben Sie DATE,TIME oder QUIT ein");
              String wunsch = vomClient.readLine();         //vomClient empfangen
              if (wunsch == null || wunsch.equalsIgnoreCase("quit")) {
                break;                               //Schleife abbrechen
              }
              Date jetzt = new Date();         // Zeitpunkt bestimmen
              
              //vom Client empfangenes Kommando ausführen
              if (wunsch.equalsIgnoreCase("date")) {
                  zumClient.println(date.format(jetzt));
              }
              else if (wunsch.equalsIgnoreCase("time")){
                  zumClient.println(time.format(jetzt));
              }
              else {
                zumClient.println(wunsch + "ist als Kommando unzulässig!");
              }
       }
       s.close();                          //Socket (und damit auch Ströme) schließen
     }
     catch (IOException e) {
       System.out.println("IO-Error bei Client " + nr);
     }
     System.out.println("Protokoll für Client " +nr + " beendet");
   }
}

Code:
import java.io.*;
import java.net.*;

public class MyClient {
      //liest alle alle vom Server geschickten Daten
      static void zeigeWasKommt(BufferedReader sin) throws IOException {
        String str = null;
        try {
          while ((str = sin.readLine()) != null)
            System.out.println (str);
        }
        catch (SocketTimeoutException sto) {
        }
      }
      
      static void zeigePrompt() {
        System.out.print("> ");
        System.out.flush();
      }
      
      public static void main (String[] args) {
        try {
          System.out.println("Client läuft. Beenden mit QUIT.");
          Socket c = new Socket(args[0], Integer.parseInt(args[1]));
          c.setSoTimeout(500); // setze Timeout auf eine halbe Sekunde +
          BufferedReader vomServer = new BufferedReader(
                                         new InputStreamReader(
                                             c.getInputStream()));
          PrintWriter zumServer = new PrintWriter(
                                    c.getOutputStream(),true);
          BufferedReader vonTastatur = new BufferedReader(
                                         new InputStreamReader(
                                             System.in));
          String zeile;
          
          do {
            zeigeWasKommt(vomServer);
            zeigePrompt();
            zeile = vonTastatur.readLine();
            zumServer.println(zeile);
          } while(!zeile.equalsIgnoreCase("quit"));
          
          c.close();                              //Socket (und damit Ströme) schließen
        }
        catch (ArrayIndexOutOfBoundsException ae) {
           System.out.println("Aufruf: java MyClient <Port-Nummer>");
        }
        catch (UnknownHostException ux) {
           System.out.println("Kein DNS-Eintrag fuer " + args[0]);
        }
        catch (IOException e) {
           e.printStackTrace();
        }
      }
}

wäre echt super wenn mir da jemand helfen könnte
 
Versuch mal das Komma zwischen localhost und Port wegzulassen.

Also in der Form: java MyClient localhost 2222
 
Hi Herli,

ich habe mir dein Source angeschaut und es scheint alles ok zu sein bis auf deine Date/Time Patterns. Sie sind syntaktisch nicht ganz korrekt.

Date Pattern: "EEEE 'Text' dd.MM.yy"

Die richtige Schreibweise müsste also folgendermaßen aussehen:

static SimpleDateFormat //Formate für den Zeitpunkt
time = new SimpleDateFormat("'Es ist gerade' H.mm 'Uhr.'"),
date = new SimpleDateFormat("'Heute ist' EEEE', der' dd.MM.yy");

Viel Spaß

Ave
 
Hallo,

wie Teppi schon sagte, ohne Komma dazwischen.
Sieht mir eher nach einem DNS-Problem aus. Oder hast du vielleicht eine Firewall an.
Probier mal null als hostname (steht für loopback laut api )

Grüsse TrueSun
 
mmh das mit der Firewall ist auch nicht des Rätsels Lösung. null anstatt localhost geht auch nicht...
Könnte es vielleicht sein, dass es daran liegt, dass ich über einen Router/Switch ins Netz gehe?
Funktioniert das Beispiel bei euch?
 
Zurück