# Client/Server vorhandene Textdatei auslesen



## Jack Bauer (4. Jun 2007)

Hallo,

ich sitze seit gestern an einem Problem das ich leider nicht gelöst bekomme. Zuerst einmal verstehe ich sehr wenig von Client/Server, würde gern mehr verstehen hab aber noch keine einfache und verständliche Einführung in das Thema gefunden.

Zu meinem Problem.

Ich habe eine Textdatei in der Daten stehen, die ich auslesen möchte und in einer Tabelle auf dem Bildschirm ausgebe. Das gewöhnliche auslesen funktioniert ohne Probleme. Leider soll das über einen Server laufen, der dann z. B. auf der Konsole noch ausgibt "Lese Zeile 2" - "Lese Zeile 3" ...

Weiß nicht wie ich da am besten vorgehe. Bin am verzweifeln. Bin für jede Hilfe dankbar.

Mit freundlichen Grüßen.


----------



## madboy (4. Jun 2007)

> Leider soll das über einen Server laufen


Was genau soll über den Server laufen? Das Auslesen, das Anzeigen oder beides?
Schreibst du Client und Server selber?
Wie sollen Client und Server kommunizieren (Sockets, Pipes, ...)?


----------



## Jack Bauer (4. Jun 2007)

Danke für die schnelle Antwort.

Der Client und der Server kommuniziert über Sockets.
Kann man auch fertige Clients und Server verwenden, wenn ja wie geht das?

Also das Auslesen sollte über den Server stattfinden, angezeigt wird das dann in einer Tabelle auf einer Oberfläche.

Mein Server sieht zur Zeit so aus:


```
import java.io.*;
import java.net.*;
import java.util.*;
import javax.swing.*;

public class server
{
  static int port = 10001;
  
  public static void main(String[]args)
  {
    int count = 0;
    
    try
    {
      ServerSocket httpd = new ServerSocket(port);
   
      while(true)
      {
        Socket socket = httpd.accept();
        (new ServerStart(count++, socket)).start();
      }
    }
    catch (Exception e)
    {
      System.err.println(e.toString());
      System.exit(1);
    }
  }
}

class ServerStart extends Thread
{
  Socket socket;
    
  public ServerStart(int Name, Socket socket) throws Exception
  {
    this.socket = socket;
    runserver();
  }
    
  void runserver() throws Exception
  {
    System.out.println("Verbinde ...");
    Socket client = socket;
    System.out.println("Verbunden mit: " + client.getInetAddress() + " Port: " + client.getPort());
    income(client);
  }
     
  void income(Socket client) throws Exception
  {
    byte[] c = new byte[128];
    OutputStream stream = client.getOutputStream();
    int size = 0;

    System.out.println(stream);
    String message = new String(c, 0, size);
    if (message == "\r")
    {
      return;
    }
    System.out.println("Datensatz empfangen: " + message);
    client.close();
    socket.close();
    speichern(message);
  }
     
  void speichern(String message)
  {
    try
    {
      System.out.println("Lese Datensätze aus 'Prüfpläne.txt'.");
      BufferedReader urlspeichern = new BufferedReader(new OutputStreamReader(new FileOutputReader("Prüfpläne.txt", true)));
      urlspeichern.write(message);
      urlspeichern.newLine();
      urlspeichern.flush();
      urlspeichern.close();
    }
 
    catch(IOException e)
    {
      System.out.println("Server error");
    }
  }
}
```

und so der Client:


```
package anzeigen;                                                                                        //Paket erstellen

import java.awt.*;                                                                                       //importieren von Paketen und Klassen
import java.awt.event.*;
import java.io.*;
import java.net.*;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;

public class Prüfpläneanzeigen extends JFrame                                                            //Klasse Prüfpläneanzeigen erbt von Oberklasse JFrame
{
  private String[] Spaltennamen = {"Getriebetyp", "Nummer", "Art", "Dokumentiert", "Prüfmittel", "Messbereich", "Prüfablauf", "Prüfergebnis"};    //Deklaration eines Strings
  private DefaultTableModel AnzeigenTabelle;                                                             //Deklaration eines Tabellenmodels
  private JComponent contentPane = (JComponent) getContentPane();                                        //Deklaration von JComponent für Ereignisabfrage

  Prüfpläneanzeigen()                                                                                    //Methode Prüfpläneanzeigen
  {
    super("Alle Prüfpläne anzeigen");                                                                    //Titelleiste wird als Alle Prüfpläne anzeigen bezeichnet
    AnzeigenLayout();                                                                                    //Methode AnzeigenLayout aufrufen
    ClientThread b = new ClientThread(String Test);
    readTable();                                                                                         //Methode readTable aufrufen
  }

  void AnzeigenLayout()                                                                                  //Methode AnzeigenLayout
  {
    contentPane.setLayout(new BorderLayout());                                                           //Variable contentPane wird der BorderLayout zugewiesen

    createAnzeigenMenuleiste();                                                                          //Methode createMenuleiste aufrufen

    AnzeigenTabelle = new DefaultTableModel(null, Spaltennamen);                                         //neues Tabellenmodel wird erstellt
    JTable tblAnzeigen = new JTable(AnzeigenTabelle);                                                    //neue Tabelle wird erstellt
    tblAnzeigen.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);                                       //passt die Größe der Spalten an

    JScrollPane scrollPane = new JScrollPane(tblAnzeigen);                                               //Scrollleiste erstellen
    scrollPane.setPreferredSize(new Dimension(785, 500));                                                //Größe der Tabelle festlegen

    JPanel panelAnzeigenTable = new JPanel();                                                            //JPanel erzeugen
    panelAnzeigenTable.add("Center", scrollPane);                                                        //Scrollleiste Tabelle zuweisen
    contentPane.add("West", panelAnzeigenTable);                                                         //JPanel auf Fenster ablegen

    JButton btnAnzeigenOK = new JButton("OK");                                                           //JButton erzeugen
    btnAnzeigenOK.addActionListener(new ActionListener()                                                 //JButton Aktion zuweisen
    {
      public void actionPerformed(ActionEvent e)
      {
        closeAnzeigenWindow();                                                                           //Methode closeAnzeigenWindow aufrufen
      }
    });

    JPanel panelAnzeigenButton = new JPanel();                                                           //JPanel erzeugen
    panelAnzeigenButton.add(btnAnzeigenOK);                                                              //JButton JPanel zuweisen
    contentPane.add("South", panelAnzeigenButton);                                                       //JPanel auf Fenster ablegen
  }

  private void createAnzeigenMenuleiste()                                                                //Methode createAnzeigenMenuleiste
  {
    JMenuBar Anzeigenleiste = new JMenuBar();                                                            //Menuleiste erzeugen
    JMenu AnzeigenProgramm = new JMenu("Programm");                                                      //Menu "Programm" erzeugen

    JMenuItem AnzeigenEnde = new JMenuItem("Beenden");                                                   //Menupunkt "Beenden" erzeugen

    AnzeigenProgramm.add(AnzeigenEnde);                                                                  //Menupunkt Menu zuweisen
    
    AnzeigenEnde.addActionListener(new ActionListener()                                                  //Menupunkt Aktion zuweisen
    {
      public void actionPerformed(ActionEvent e)
      {
        closeAnzeigenProgramm();                                                                         //Methode closeAnzeigenProgramm aufrufen
      }
    });

    Anzeigenleiste.add(AnzeigenProgramm);                                                                //Menu Menuleiste zuweisen
    setJMenuBar(Anzeigenleiste);                                                                         //Menuleiste wird auf Fenster abgelegt
  }
  
  void closeAnzeigenProgramm()                                                                           //Methode closeAnzeigenProgramm
  {
    System.exit(0);                                                                                      //schließt das komplette Programm
  }

  void closeAnzeigenWindow()                                                                             //Methode closeAnzeigenWindow
  {
    this.setVisible(false);                                                                              //schließt das Fenster "Alle Prüfpläne anzeigen"
  }

  protected void readTable()                                                                             //Methode readTable
  {
    try
    {
      BufferedReader Anzeigenreader = new BufferedReader(new FileReader("Prüfpläne.txt"));               //auslesen aus Textdatei

      String strAnzeigenLine;
      String Test = Anzeigenreader.readLine();                                                                            //String deklarieren
      while((strAnzeigenLine = Anzeigenreader.readLine()) != null)                                       //while-Schleife beginnen
      {
        String[] AnzeigenSplit = strAnzeigenLine.split(";");                                             //Text wird bis zum Semikolen abgeschnitten
        AnzeigenTabelle.addRow(AnzeigenSplit);                                                           //abgeschnittener Text an Tabelle übergeben
      }
      AnzeigenTabelle.fireTableDataChanged();
      JOptionPane.showMessageDialog(null, "Die Datenbank enthält zurzeit " + AnzeigenTabelle.getRowCount() + " Datensätze.", "Information", JOptionPane.INFORMATION_MESSAGE);
    }

    catch(FileNotFoundException e)
    {
      JOptionPane.showMessageDialog(null, "Datei 'Prüfpläne.txt' wurde nicht gefunden.", "Fehlermeldung", JOptionPane.ERROR_MESSAGE);
    }

    catch(IOException e)
    {
      JOptionPane.showMessageDialog(null, "Sie besitzen keinen Lesezugriff auf die Datei 'Prüfpläne.txt'.", "Information", JOptionPane.INFORMATION_MESSAGE);
    }
  }

  public static void Prfanzeigen()                                                                       //Methode Anzeigen
  {
    Prüfpläneanzeigen Anzeigen = new Prüfpläneanzeigen();                                                //Prüfpläneanzeigen erzeugen
    Anzeigen.setLocation(100, 100);                                                                      //Fenster um 100 Pixel nach rechts und 100 nach unten versetzt
    Anzeigen.setSize(800, 600);                                                                          //Fenstergröße
    Anzeigen.setResizable(false);                                                                        //Fenstergröße nicht veränderbar
    Anzeigen.setVisible(true);                                                                           //Fenster anzeigen
  }
}

class ClientThread extends Thread
{
   ClientThread(String Test)
   {
    empfangen(Test);
   }

  public void empfangen(String Test)
     {try
      {Socket socket = new Socket("localhost", 10001);
       socket.getOutputStream().write(Test.getBytes());
       socket.close();
      }
     catch (UnknownHostException e)
      {
      }
     catch (IOException e)
      {
      }
    }
}
```

Sind bestimmt ein Haufen Fehler drin aber wie gesagt hab noch keine Ahnung von Client/Server, versuch das zu lernen. Deswegen bin ich für jede Hilfe dankbar. Weißt du wo man ein gutes und leicht verständliches Tutorial über Client/Server findet?

Danke.


----------



## madboy (4. Jun 2007)

> Kann man auch fertige Clients und Server verwenden, wenn ja wie geht das?


 Das kommt drauf an. Es gibt fertige HTTP-Server, fertige Clients (Browser), ... Kommt immer auf die Umstände an, was man genau machen will.

Was ich aber gemeint habe ist, ob du vielleicht nen Server vorgegeben bekommen hast und jetzt nen Client dazu schreiben sollst oder andersherum, was aber wohl nicht der Fall ist.


Deinen Code hab ich jetzt nur mal überflogen und kann daher nicht sagen, ob und wenn ja, was für Fehler drin sind.
Eins ist mir jedoch aufgefallen:

```
String message = new String(c, 0, size); 
    if (message == "\r")
```
Ganz böse. Vergleiche Strings IMMER mit .equals(). Auch bei anderen Objekten immer .equals() verwenden



> Sind bestimmt ein Haufen Fehler drin aber wie gesagt hab noch keine Ahnung von Client/Server, versuch das zu lernen. Deswegen bin ich für jede Hilfe dankbar. Weißt du wo man ein gutes und leicht verständliches Tutorial über Client/Server findet?


 In fer FAQ hier vom Forum gibts was zum Thema, unter anderem auch einen Chat-Server und -Client. Vielleicht hilft dir das ja weiter.
Des weiteren: http://www.galileocomputing.de/openbook/javainsel6/javainsel_16_008.htm#Xxx999821


Grundsätzlich würde ich dir empfehlen, zum üben keine komplexen Daten zu schicken und darzustellen, sondern eine ganz einfache Anwendung zu schreiben. Am besten komplett ohne grafische Oberfläche. Also nach dem Prinzip
Client sendet "bla"
Server empfängt "bla", gibt es aus und sendet "empfang OK" an den Client.
Client gibt "empfang OK" aus.


----------



## Jack Bauer (7. Jun 2007)

Danke für Deine Hilfe.

Habe nun ein anderes Problem und zwar habe ich anhand der Beschreibung in den FAQs einen Client und einen Server geschrieben der Server wird gestartet aber der Client sendet nichts an den Server. Hier mein Coding.

Server

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

public class TestServer extends
{
  public static void main(String[] args)
  {
    try
    {
      //Server starten
      ServerSocket server = new ServerSocket(1234);
      
      //warte auf Verbindung
      System.out.println("Warte auf Verbindung.");
      Socket s = server.accept();
      
      //neue Verbindung ist da, wir lesen einfach aus,
      //was sie uns so schickt und schicken dann alles in Großbuchstaben zurück
      BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
      String text = in.readLine();
      BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
      out.write(text.toUpperCase());
      out.newLine();
      out.flush();
      
      //aufräumen
      out.close();
      in.close();
      server.close();
    }
    catch (Exception e)
    {System.out.println("Fehler");}
  }
}
```

Client

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

public class TestClient
{
  //static int port = 1234;
  public static void main(String[] args)
  {
    try
    {
      //Socket auf Lokalhost Port 1234 konstruieren
      Socket s = new Socket("lokalhost", 1234);

      //etwas über den Socket versenden
      BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
      out.write("Hallo");
      
      //Zeilenumbruch senden
      out.newLine();
      out.flush();
      
      //BufferedReader konstruieren
      BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
      
      //eine Zeile lesen
      String text = in.readLine();
      
      //und ausgeben
      System.out.println("Received: ");
      System.out.println(text);
      
      //Reader und Writer schließen
      out.close();
      in.close();
    }
    catch (Exception e)
    {System.out.println("Fehler");}
  }
}
```

Danke.


----------



## anfänger15 (7. Jun 2007)

public class TestServer extends 

gibt das bei dir nicht eine Fehlermeldung?


----------



## anfänger15 (7. Jun 2007)

und noch was 
das heißt "localhost" dann geht es bei mir


----------



## Jack Bauer (7. Jun 2007)

Vielen Dank es hat funktioniert. Ja das extends hat einen Fehler gebracht. Ich hab zuvor was probiert und dann aus versehen nicht alles gelöscht.

Nochmals vielen Dank.


----------



## Jack Bauer (8. Jun 2007)

Habe jetzt einen Client und einen Server erstellt, der in eine Textdatei was reinschreibt und einen anderen Client und Server der den Inhalt der Datei ausliest.

Kann man das auch kombinieren? So dass man nur einen Server hat und je nachdem welcher Client aufgerufen wird liest dieser dann aus der Datei aus oder schreibt in die Datei was rein?

Server speichern:

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

public class Server_in_Datei_speichern
{
  public static void main(String[] args)
  {
    try
    {
      //Server starten
      ServerSocket server = new ServerSocket(1234);

      //warte auf Verbindung
      System.out.println("Warte auf Verbindung.");
      Socket s = server.accept();
      System.out.println("Verbunden.");
      
      //neue Verbindung ist da, wir lesen einfach aus, was sie uns so schickt
      BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
      String text = in.readLine();
      System.out.println("Nachricht empfangen: " + text);

      //schreibe empfangene Nachricht in die Datei "Datenbank.txt"
      BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("Datenbank.txt", true)));
      out.write(text);
      out.newLine();
      out.flush();
      System.out.println("Empfange Nachricht wurde erfolgreich in die Datei 'Datenbank.txt' geschrieben.");
      
      //aufräumen
      out.close();
      in.close();
      server.close();
      System.out.println("Server geschlossen.");
    }
    catch (Exception e)
    {System.out.println("Fehler");}
  }
}
```

Client speichern:

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

public class Client_in_Datei_speichern
{
  public static void main(String[] args)
  {
    try
    {
      //Socket auf Lokalhost Port 1234 konstruieren
      Socket s = new Socket("localhost", 1234);

      //etwas über den Socket versenden
      BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
      String versende = "Hallo";
      out.write(versende);
      System.out.println("Sende '" + versende + "' an Server Port 1234.");
      
      //Zeilenumbruch senden
      out.newLine();
      out.flush();
      
      //Writer schließen
      out.close();
      
      System.out.println("Beendet.");
    }
    catch (Exception e)
    {System.out.println("Fehler");}
  }
}
```

Server auslesen:

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

public class Server_aus_Datei_lesen
{
  public static void main(String[] args)
  {
    try
    {
      //Server starten
      ServerSocket server = new ServerSocket(5678);

      //warte auf Verbindung
      System.out.println("Warte auf Verbindung.");
      Socket s = server.accept();
      System.out.println("Verbunden.");

      //neue Verbindung ist da, wir lesen einfach aus,
      //was sie uns so schickt und schicken alles wieder zurück
      BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
      String text = in.readLine();
      System.out.println("Nachricht empfangen: " + text);
      BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
      out.write(text);
      out.newLine();
      out.flush();

      System.out.println("Nachricht zurückgesendet.");

      //aufräumen
      out.close();
      in.close();
      server.close();
      System.out.println("Server geschlossen.");
    }
    catch (Exception e)
    {System.out.println("Fehler");}
  }
}
```

Client auslesen:
	
	
	
	





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

public class Client_aus_Datei_lesen
{
  public static void main(String[] args)
  {
    try
    {
      //Socket auf Lokalhost Port 5678 konstruieren
      Socket s = new Socket("localhost", 5678);

      //aus der Datei "Datenbank.txt" auslesen und über den Socket versenden
      BufferedReader readin = new BufferedReader(new InputStreamReader(new FileInputStream("Datenbank.txt")));
      String versende = readin.readLine();
      BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
      out.write(versende);
      System.out.println("Sende " + versende + " an Server Port 5678.");
      
      //Zeilenumbruch senden
      out.newLine();
      out.flush();
      
      //BufferedReader konstruieren
      BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
      
      //eine Zeile lesen
      String text = in.readLine();
      
      //und ausgeben
      System.out.println("Received: ");
      System.out.println(text);
      
      //Reader und Writer schließen
      readin.close();
      out.close();
      in.close();
      
      System.out.println("Beendet.");
    }
    catch (Exception e)
    {System.out.println("Fehler");}
  }
}
```

Vielen Dank im Voraus.


----------



## Jack Bauer (8. Jun 2007)

Hab jetzt aus beiden Servern einen gebastelt.

Sieht jetzt so aus. Es läuft auch soweit ganz gut.
Leider wird auf der Server-Konsole jedes Mal folgendes ausgegeben.

Der Befehl "n_Datei_speichern" ist entweder falsch geschrieben oder konnte nicht gefunden werden.

Und im Konsolenfenster des Clients "Client_in_Datei_speichern" wird leider nicht "Fertig" ausgegeben sondern "Fehler".

Im Konsolenfenster des "Client_aus_Datei_lesen" zwar "Beendet" ausgegeben aber "Fertig" fehlt auch hier.

Muss man das wegen den zwei  If-Schleifen mit Threads machen, oder liegt es nicht daran?

Server:

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

public class Server
{
  public static void main(String[] args)
  {
    try
    {
      //Server starten
      ServerSocket server = new ServerSocket(1234);

      //warte auf Verbindung
      System.out.println("Warte auf Verbindung.");
      Socket s = server.accept();
      System.out.println("Verbunden.");

      //neue Verbindung ist da, wir lesen einfach aus,
      //was sie uns so schickt und schicken alles wieder zurück
      BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
      String text = in.readLine();
      String [] MessageSplit = text.split("§");
      String Befehl = MessageSplit[0];
      String Nachricht = MessageSplit[1];
      String Befehlspeichern = "speichern";
      String Befehllesen = "lesen";

      if (Befehl.equals(Befehlspeichern))
      {
        System.out.println("1");
        System.out.println("Befehl: " + Befehl);
        System.out.println("Nachricht empfangen: " + Nachricht);
        BufferedWriter outspeichern = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("Datenbank.txt", true)));
        outspeichern.write(Nachricht);
        outspeichern.newLine();
        outspeichern.flush();
        System.out.println("Empfange Nachricht wurde erfolgreich in die Datei 'Datenbank.txt' geschrieben.");
        outspeichern.close();
      }

      else
      {
        if (Befehl.equals(Befehllesen))
        {
          System.out.println("2");
          System.out.println("Befehl: " + Befehl);
          System.out.println("Nachricht empfangen: " + Nachricht);
          BufferedWriter outlesen = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
          outlesen.write(Nachricht);
          outlesen.newLine();
          outlesen.flush();
          System.out.println("Nachricht zurückgesendet.");
          outlesen.close();
        }
      }
      
      BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
      out.write("Fertig");
      out.newLine();
      out.flush();
      
      //aufräumen
      out.close();
      in.close();
      server.close();
      System.out.println("Server geschlossen.");
    }
    catch (Exception e)
    {System.out.println("Fehler");}
  }
}
```

Client_in_Datei_speichern:

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

public class Client_in_Datei_speichern
{
  public static void main(String[] args)
  {
    try
    {
      //Socket auf Lokalhost Port 1234 konstruieren
      Socket s = new Socket("localhost", 1234);

      //etwas über den Socket versenden
      BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
      String speichern = "speichern§";
      String versenden = "Hallo";
      out.write(speichern);
      out.write(versenden);
      System.out.println("Sende '" + versenden + "' an Server Port 1234.");
      
      //Zeilenumbruch senden
      out.newLine();
      out.flush();
      
      //Writer schließen
      out.close();
      
      //erhält Nachricht vom Server das der Vorgang bearbeitet wurde
      BufferedReader inServer = new BufferedReader(new InputStreamReader(s.getInputStream()));
      String ServerNachricht = inServer.readLine();
      inServer.close();
      
      System.out.println("Beendet.");
    }
    catch (Exception e)
    {System.out.println("Fehler");}
  }
}
```

Client_aus_Datei_lesen:

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

public class Client_aus_Datei_lesen
{
  public static void main(String[] args)
  {
    try
    {
      //Socket auf Lokalhost Port 5678 konstruieren
      Socket s = new Socket("localhost", 1234);

      //aus der Datei "Datenbank.txt" auslesen und über den Socket versenden
      BufferedReader readin = new BufferedReader(new InputStreamReader(new FileInputStream("Datenbank.txt")));
      String versenden = readin.readLine();
      BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
      String lesen = "lesen§";
      out.write(lesen);
      out.write(versenden);
      System.out.println("Sende " + versenden + " an Server Port 1234.");
      
      //Zeilenumbruch senden
      out.newLine();
      out.flush();
      
      //BufferedReader konstruieren
      BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
      
      //eine Zeile lesen
      String text = in.readLine();
      
      //und ausgeben
      System.out.println("Empfangen: " + text);
      in.readLine();
      
      //Reader und Writer schließen
      readin.close();
      out.close();
      in.close();
      
      System.out.println("Beendet.");
    }
    catch (Exception e)
    {System.out.println("Fehler");}
  }
}
```

Vielen Dank.


----------



## madboy (8. Jun 2007)

Hi. Ich habe zwar keine Lösung für dein Problem, aber ein paar "Anregungen"

Eins vorweg: ich habe den Codingstyle gerade nicht genau im Kopf. Aber sollte eigentlich passen, was ich schreibe :wink: 
- Schreibe Klassennamen immer groß und ohne Unterstrich (also z.B. class MeinTollerServer {...).
- Variablennamen werden immer klein geschrieben (z.B. int meineVariable = ...). 
- Für die Zukunft, wenn du Konstanten benötigst: die werden ganz groß und mit Unterstrichen getrennt geschrieben (z.B. final int MEINE_ERSTE_KONSTANTE = 10; )

- Die einzelnen Befehle würde ich nicht durch § trennen. Ein Zeilenumbruch wäre wohl geeigneter (also "\n")


```
...
      else 
      { 
        if (Befehl.equals(Befehllesen))
...
```
lässt sich auch als 

```
...
      else if (Befehl.equals(Befehllesen))
...
```
schreiben. Ist meiner Meinung nach übersichtlicher.

Ganz böse:

```
catch (Exception e) 
    {System.out.println("Fehler");}
```
mach nie catch(Exception e). Das fängt alle Exceptions. Das hört sich zwar gut an, ist es aber nicht. Bzw. mach das nur wenn du genau weißt, was du tust.
statt dessen fange die Exceptions einzeln:

```
catch (FileNotFoundException e)  {
  e.printStackTrace();
  } catch (IOException io) {
  io.printStackTrace();
  }
```
Wie du hier siehst, schreibe ich io.printStackTrace() anstatt System.out.println("Fehler");. Das erleichtert die Fehlersuche ungemein.

Sollten nach diesen Änderungen immer noch Probleme auftauchen: poste bitte die gesamten Fehlermeldungen.


----------



## Jack Bauer (9. Jun 2007)

Danke für die Stylingtyps habe sie soweit beherzigt, falls Dir noch was auffällt bin ich Dir für jeden Hinweis dankbar.

Jetzt bekomme ich auch exakte Fehlermeldungen, leider weiß ich nicht genau wo ich den Fehler beheben muss.

Server:

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

public class Server
{
  public static void main(String[] args)
  {
    try
    {
      //Server starten
      ServerSocket server = new ServerSocket(1234);

      //warte auf Verbindung
      System.out.println("Warte auf Verbindung.");
      Socket s = server.accept();
      System.out.println("Verbunden.");

      //neue Verbindung ist da, wir lesen einfach aus,
      //was sie uns so schickt und schicken alles wieder zurück
      BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
      String text = in.readLine();
      String [] messagesplit = text.split("§");
      String befehl = messagesplit[0];
      String nachricht = messagesplit[1];
      String befehlspeichern = "speichern";
      String befehllesen = "lesen";

      if (befehl.equals(befehlspeichern))
      {
        System.out.println("1");
        System.out.println("Befehl: " + befehl);
        System.out.println("Nachricht empfangen: " + nachricht);
        BufferedWriter outspeichern = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("Datenbank.txt", true)));
        outspeichern.write(nachricht);
        outspeichern.newLine();
        outspeichern.flush();
        System.out.println("Empfange Nachricht wurde erfolgreich in die Datei 'Datenbank.txt' geschrieben.");
        outspeichern.close();
      }

      else if (befehl.equals(befehllesen))
      {
        System.out.println("2");
        System.out.println("Befehl: " + befehl);
        System.out.println("Nachricht empfangen: " + nachricht);
        BufferedWriter outlesen = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        outlesen.write(nachricht);
        outlesen.newLine();
        outlesen.flush();
        System.out.println("Nachricht zurückgesendet.");
        outlesen.close();
      }
      
      BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
      out.write("Fertig");
      out.newLine();
      out.flush();
      
      //aufräumen
      out.close();
      in.close();
      server.close();
      System.out.println("Server geschlossen.");
    }

    catch (FileNotFoundException e)
    {
      e.printStackTrace();
    }

    catch (IOException io)
    {
      io.printStackTrace();
    }
  }
}
```

Client lesen:

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

public class ClientAusDateiLesen
{
  public static void main(String[] args)
  {
    try
    {
      //Socket auf Lokalhost Port 5678 konstruieren
      Socket s = new Socket("localhost", 1234);

      //aus der Datei "Datenbank.txt" auslesen und über den Socket versenden
      BufferedReader readin = new BufferedReader(new InputStreamReader(new FileInputStream("Datenbank.txt")));
      String versenden = readin.readLine();
      BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
      String lesen = "lesen§";
      out.write(lesen);
      out.write(versenden);
      System.out.println("Sende " + versenden + " an Server Port 1234.");
      
      //Zeilenumbruch senden
      out.newLine();
      out.flush();
      
      //BufferedReader konstruieren
      BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
      
      //eine Zeile lesen
      String text = in.readLine();
      
      //und ausgeben
      System.out.println("Empfangen: " + text);
      in.readLine();
      
      //Reader und Writer schließen
      readin.close();
      out.close();
      in.close();
      
      System.out.println("Beendet.");
    }

    catch (FileNotFoundException e)
    {
      e.printStackTrace();
    }

    catch (IOException io)
    {
      io.printStackTrace();
    }
  }
}
```

Wenn ich den Server und den Client starte dann wird folgendes auf dem Konsolenfenster des Servers ausgegeben:


----------



## Jack Bauer (9. Jun 2007)

Danke für die Stylingtyps habe sie soweit beherzigt, falls Dir noch was auffällt bin ich Dir für jeden Hinweis dankbar.

Jetzt bekomme ich auch exakte Fehlermeldungen, leider weiß ich nicht genau wo ich den Fehler beheben muss.

Server:

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

public class Server
{
  public static void main(String[] args)
  {
    try
    {
      //Server starten
      ServerSocket server = new ServerSocket(1234);

      //warte auf Verbindung
      System.out.println("Warte auf Verbindung.");
      Socket s = server.accept();
      System.out.println("Verbunden.");

      //neue Verbindung ist da, wir lesen einfach aus,
      //was sie uns so schickt und schicken alles wieder zurück
      BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
      String text = in.readLine();
      String [] messagesplit = text.split("§");
      String befehl = messagesplit[0];
      String nachricht = messagesplit[1];
      String befehlspeichern = "speichern";
      String befehllesen = "lesen";

      if (befehl.equals(befehlspeichern))
      {
        System.out.println("1");
        System.out.println("Befehl: " + befehl);
        System.out.println("Nachricht empfangen: " + nachricht);
        BufferedWriter outspeichern = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("Datenbank.txt", true)));
        outspeichern.write(nachricht);
        outspeichern.newLine();
        outspeichern.flush();
        System.out.println("Empfange Nachricht wurde erfolgreich in die Datei 'Datenbank.txt' geschrieben.");
        outspeichern.close();
      }

      else if (befehl.equals(befehllesen))
      {
        System.out.println("2");
        System.out.println("Befehl: " + befehl);
        System.out.println("Nachricht empfangen: " + nachricht);
        BufferedWriter outlesen = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        outlesen.write(nachricht);
        outlesen.newLine();
        outlesen.flush();
        System.out.println("Nachricht zurückgesendet.");
        outlesen.close();
      }
      
      BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
      out.write("Fertig");
      out.newLine();
      out.flush();
      
      //aufräumen
      out.close();
      in.close();
      server.close();
      System.out.println("Server geschlossen.");
    }

    catch (FileNotFoundException e)
    {
      e.printStackTrace();
    }

    catch (IOException io)
    {
      io.printStackTrace();
    }
  }
}
```

Client lesen:

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

public class ClientAusDateiLesen
{
  public static void main(String[] args)
  {
    try
    {
      //Socket auf Lokalhost Port 5678 konstruieren
      Socket s = new Socket("localhost", 1234);

      //aus der Datei "Datenbank.txt" auslesen und über den Socket versenden
      BufferedReader readin = new BufferedReader(new InputStreamReader(new FileInputStream("Datenbank.txt")));
      String versenden = readin.readLine();
      BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
      String lesen = "lesen§";
      out.write(lesen);
      out.write(versenden);
      System.out.println("Sende " + versenden + " an Server Port 1234.");
      
      //Zeilenumbruch senden
      out.newLine();
      out.flush();
      
      //BufferedReader konstruieren
      BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
      
      //eine Zeile lesen
      String text = in.readLine();
      
      //und ausgeben
      System.out.println("Empfangen: " + text);
      in.readLine();
      
      //Reader und Writer schließen
      readin.close();
      out.close();
      in.close();
      
      System.out.println("Beendet.");
    }

    catch (FileNotFoundException e)
    {
      e.printStackTrace();
    }

    catch (IOException io)
    {
      io.printStackTrace();
    }
  }
}
```

Wenn ich den Server und den Client starte dann wird folgendes auf dem Konsolenfenster des Servers ausgegeben:

Warte auf Verbindung.
Verbunden.
2
Befehl: lesen
Nachricht empfangen: Hallo
Nachricht zurückgesendet.
java.net.SocketException: Socket is closed
          at java.net.Socket.getOutputStream<Socket.java:808>
          at Server.main<Server.java:54>
Der Befehl "sDateiLesen" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.

Im Konsolenfenster des Clients wird das ausgegeben:

Sende Hallo an Server Port 1234
Empfangen: Hallo
Beendet.

Vor Beendet sollte eigentlich noch Fertig vom Server an den Client übergeben werden aber das macht er nicht.
Also so wie ich das verstehe wurde der Server geschlossen und kann das letzte nicht mehr absenden, aber wieso?
Wo liegt der Fehler?

Vielen Dank.


----------



## madboy (9. Jun 2007)

Das Problem ist, dass du einen neuen Reader vom Socket holst und den dann schließt. Dadurch wird auch der Socket geschlossen.

Hole nur ein einen Reader für den Socket beim Server und verwende den dann öfter. Das gleiche gilt für Writer. 
Auch hilfreich ist es, die Reader/Writer nach ihrer Funktion zu benennen. Vor allem in größeren Programmen, wo du mehrere Reader/Writer hast, ist es von Vorteil wenn man am Name erkennt, wohin geschrieben wird (Datei, Socket, ...).

So z.B.:

```
public class Server 
{ 
  public static void main(String[] args) 
  { 
    try 
    { 
      //Server starten 
      ServerSocket server = new ServerSocket(1234); 

      //warte auf Verbindung 
      System.out.println("Warte auf Verbindung."); 
      Socket s = server.accept(); 
      System.out.println("Verbunden."); 

      //neue Verbindung ist da, wir lesen einfach aus, 
      //was sie uns so schickt und schicken alles wieder zurück 
      BufferedReader socketReader = new BufferedReader(new InputStreamReader(s.getInputStream()));

      //erstelle Writer für Datenbankdatei
      BufferedWriter fileWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("Datenbank.txt", true)));
      
 
      String text = socketReader.readLine(); 
      String [] messagesplit = text.split("§"); 
      String befehl = messagesplit[0]; 
      String nachricht = messagesplit[1]; 
      String befehlspeichern = "speichern"; 
      String befehllesen = "lesen"; 

      if (befehl.equals(befehlspeichern)) 
      { 
        System.out.println("1"); 
        System.out.println("Befehl: " + befehl); 
        System.out.println("Nachricht empfangen: " + nachricht); 
         
        fileWriter.write(nachricht); 
        fileWriter.newLine(); 
        fileWriter.flush(); 
        System.out.println("Empfange Nachricht wurde erfolgreich in die Datei 'Datenbank.txt' geschrieben."); 
       
      } 

      else if (befehl.equals(befehllesen)) 
      { 
        System.out.println("2"); 
        System.out.println("Befehl: " + befehl); 
        System.out.println("Nachricht empfangen: " + nachricht);  
        fileWriter.write(nachricht); 
        fileWriter.newLine(); 
        fileWriter.flush(); 
        System.out.println("Nachricht zurückgesendet."); 
      } 

      fileWriter.write("Fertig"); 
      fileWriter.newLine(); 
      fileWriter.flush(); 
      
      //aufräumen 
      fileWriter.close(); 
      socketReader.close(); 
      server.close(); 
      System.out.println("Server geschlossen."); 
    } 

    catch (FileNotFoundException e) 
    { 
      e.printStackTrace(); 
    } 

    catch (IOException io) 
    { 
      io.printStackTrace(); 
    } 
  } 
}
```

Was grundsätzliches noch: wenn du mehrere Clients haben willst, die (gleichzeitig) zu einem Server connecten, benötigst du Threads im Server. Für jeden verbundenen Client einen.
Wenn der Server auch nach der Verbindungstrennung "weiterleben" soll, mach eine while(true)-Schleife um Zeile 9 bis Zeile 64 in obigem Code.

Und eins noch: "catch (Exception bla)" sollte immer so nahe wie möglich an der Stelle eingebaut werden, an dem die Exception geworfen wird. Beispiel:

```
ServerSocket server = null;
    try {
        server = new ServerSocket(1234);
    } catch (IOException e) {
        e.printStackTrace();
        //ohne Socket hat es keinen Sinn, weiter zu machen ;-)
        System.exit(1);
    }
```


----------



## Guest (9. Jun 2007)

Vielen Dank du hast mir sehr geholfen.


----------

