Client/Server

Vielleicht hilf das .. :p

Server ausführen mit: java 2222
Client mit: localhost 2222

Client
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); // set
ze 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();
        }
      }
}


Server
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();
            }
      }
}



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

class DateTimeDienst extends Thread {
//  Formate für den Zeitpunkt
           
   static SimpleDateFormat time = new SimpleDateFormat("'Es ist gerade' H.mm 'Uhr.'");
   static SimpleDateFormat 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");
   }
}
 
Zuletzt bearbeitet:
@Avlence: was hast du daran verändert also wenn ich das ganze über meine extra dafür angelegten Batch-Dateien starte geht es nach wie vor nicht. Wenn ich aber zuerst in die cmd wechsle dann funktioniert es! irgendwie komisch...

Die Datein liegen auf D:
Server.bat:
@echo off
D:
C:\Programme\Java\j2sdk1.4.2_04\bin\java.exe DateTimeServer 2222

Client.bat:
@echo off
D:
C:\Programme\Java\j2sdk1.4.2_04\bin\java.exe MyClient localhost 2222
 
verändert hab ich nur die 2 Zeilen in der DataTimeDienst Klasse:

static SimpleDateFormat time = new SimpleDateFormat("'Es ist gerade' H.mm 'Uhr.'");
static SimpleDateFormat date = new SimpleDateFormat("'Heute ist' EEEE', der' dd.MM.yy");

Die Batch Dateien funktionieren bei mir ohne Probleme.

Server.bat:
@echo off
java DateTimeServer 2222

Client.bat:
@echo off
java MyClient localhost 2222

Java Pfad sollte in der "Path" Umgebungsvariable gespeichert sein. Sonst kannst du auch den gesammten Pfand der java.exe angeben, wie du es gemacht hast.

Die Batch Dateien sollten im selben Verzeichnis liegen in der sich die *.class Dateien befinden.
 
das Beipsiel funktioniert soweit, lediglich der Client startet mit der Batch-Datei nicht (Server schon!) und das verstehe ich nicht!
 
Herli hat gesagt.:
das Beipsiel funktioniert soweit, lediglich der Client startet mit der Batch-Datei nicht (Server schon!) und das verstehe ich nicht!

So, Problem gefunden: es lag doch an der Firewall (habe localhost freigegeben), obwohl ich das zuvor ausgeschlossen hatte, da es ja zuvor nicht geklappt hatte, aber vielleicht war da eben noch ein anderer Wurm drin...

Was anderes: Ich habe ja für meine Diplomarbeit eine Simulation in Java propgrammiert und zwar genau deshalb, weil ich diese Programmiersprache endlich lernen wollte. Da es mir Spaß gemacht, will ich mich ein bißchen weiterbilden - deswegen auch dieses Beispiel...

Nun, was müsste den ein Server mitbringen das dieses Beispiel im Web funktionieren würde Der Client würde auf meinem Rechner liegen und der DateTimeServer irgendwo im Netz auf einem x-beliebigen Server. Was mir da schon die ganze Zeit da schon durch den Kopf geht ist die Frage: Wie starte ich die Server-Datei?
 
Zurück