Client/Server vorhandene Textdatei auslesen

Status
Nicht offen für weitere Antworten.

Jack Bauer

Mitglied
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

Top Contributor
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

Mitglied
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:

Code:
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:

Code:
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

Top Contributor
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:
Code:
 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

Mitglied
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
Code:
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
Code:
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.
 

Jack Bauer

Mitglied
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

Mitglied
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:
Code:
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:
Code:
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:
Code:
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:
Code:
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

Mitglied
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:
Code:
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:
Code:
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:
Code:
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

Top Contributor
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")

Code:
...
      else 
      { 
        if (Befehl.equals(Befehllesen))
...
lässt sich auch als
Code:
...
      else if (Befehl.equals(Befehllesen))
...
schreiben. Ist meiner Meinung nach übersichtlicher.

Ganz böse:
Code:
    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:
Code:
    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

Mitglied
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:
Code:
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:
Code:
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

Mitglied
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:
Code:
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:
Code:
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

Top Contributor
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.:
Code:
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:
Code:
    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);
    }
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Performanteste Kommunikationsmethode zwischen Client u. Server Netzwerkprogrammierung 4
L Socket Automatische Zuweisung von Server und Client Rolle Netzwerkprogrammierung 12
ExceptionOfExpectation Server/Client-Kommunikation Netzwerkprogrammierung 34
M Server-Client-System für Browsergame Netzwerkprogrammierung 5
Yonnig Threads mit Client/Server und GUI (laufend bis button-click) Netzwerkprogrammierung 9
J Client-Server und SOAP Netzwerkprogrammierung 23
L30nS RMI Aufruf einer Client-Methode von einem RMI-Server Netzwerkprogrammierung 3
T String von Client zu Server kommt nicht an Netzwerkprogrammierung 92
D WebSocket Server mit HTML Client und Java Server Netzwerkprogrammierung 5
D Server - Client Informationsaustausch, Möglichkeiten Netzwerkprogrammierung 3
H Socket Chat entwickeln mit Java Server Client Netzwerkprogrammierung 4
X Kann ich einen Client/Server verbindung hinkriegen die mir alle paar Sekunden die aktuellen Daten per Realtime zuschickt ? Netzwerkprogrammierung 9
D Slf4j - Logging - Client-Server Architektur Netzwerkprogrammierung 3
J client server mit nur einem PC Netzwerkprogrammierung 33
M Socket Nachricht von TCP-Client an Server schicken Netzwerkprogrammierung 12
M Socket Verbindung Matlab(Server) Java(Client) Netzwerkprogrammierung 1
R Socket FATAL EXCEPTION MAIN bei Socket based client/server app Netzwerkprogrammierung 2
G Server-Client IO Problem Netzwerkprogrammierung 6
I Socket Das erste Server-Client Programm Netzwerkprogrammierung 16
M Socket Server antwortet dem Client nicht Netzwerkprogrammierung 6
I Client/Server Kommunikation bei einem Spiel Netzwerkprogrammierung 4
E Objekte versenden, Client-Server Netzwerkprogrammierung 25
C Mini Client-Server-Anwendung funktioniert nicht Netzwerkprogrammierung 8
P Server als Client nutzen Netzwerkprogrammierung 8
D Socket Run Args Client/Server Socket Netzwerkprogrammierung 1
Cromewell Socket Multithreaded Server und Client Netzwerkprogrammierung 1
Y Client/Server/DB communication Netzwerkprogrammierung 3
JavaWolf165 Socket mit .writeUtf etwas vom Client zum Server schicken Netzwerkprogrammierung 13
P RMI Client Server Programm über Internet Netzwerkprogrammierung 2
brainless Client Server Kommunikation verschlüsseln Netzwerkprogrammierung 13
gamebreiti Socket Server / Client Anwendung Manipulation von Objekten durch Server Netzwerkprogrammierung 9
T Socket Server/Client Kommunikation Netzwerkprogrammierung 8
F Server Client Anwendung mit UDP Netzwerkprogrammierung 2
A RMI Wo treten Exceptions bei RMI Aufrufen auf? Auf Client oder auf Server? Netzwerkprogrammierung 3
A ByteBuffer - Client/Server Netzwerkprogrammierung 9
K C# Server - Android Client Netzwerkprogrammierung 0
P MIME-TYPE Erklaerung, Kommunikation zwischen Client und Server Netzwerkprogrammierung 3
J Sichere Kommunikation bei Server Client Netzwerkprogrammierung 3
T Frage zu Client-Server Applikation Netzwerkprogrammierung 2
H Socket Client/Server Socket Programmieren Netzwerkprogrammierung 1
M Theoretische Frage zu Server - Client Netzwerkprogrammierung 2
P HTTP Server / Client Netzwerkprogrammierung 1
E Thematik Client server Netzwerkprogrammierung 2
D Client/Server per Crossover Lan Kabel Netzwerkprogrammierung 1
S Client Server Connection Netzwerkprogrammierung 4
V erste Client - Server Anwendung, paar Fragen wie Socketverbindung checken usw. Netzwerkprogrammierung 4
S Sichere Server/Client Architektur Netzwerkprogrammierung 1
D Chat Server/mehre Client Netzwerkprogrammierung 9
I Server+Client Netzwerkprogrammierung 3
N Client am Server abmelden Netzwerkprogrammierung 0
F Server/Client Probleme Netzwerkprogrammierung 3
U Socket Instant Messanger (Server Linux, Client Windows) Netzwerkprogrammierung 1
Athena Grundsatzfragen zu Client-Server-Architektur / Matchmaking Netzwerkprogrammierung 1
A Problem beim Senden von Client zu Server Netzwerkprogrammierung 10
F Client Server DB Netzwerkprogrammierung 0
A Verständnisfrage Multi-Threaded Client/Server Netzwerkprogrammierung 5
F Tipps zum Thema Server/Client vie SOAP Netzwerkprogrammierung 0
F Socket Java - Server/Client simple Netzwerkprogrammierung 1
R Zeitliche Syncronisation Server - Client Netzwerkprogrammierung 0
S Server-Client: Image senden Netzwerkprogrammierung 2
C Multithreading Client / Server erklärt Netzwerkprogrammierung 11
P server - client verbindung (anfänger) Netzwerkprogrammierung 8
J Client Server - Serialisierung Netzwerkprogrammierung 8
Luk10 Server / Client: Clients speichern! Netzwerkprogrammierung 6
M allgemeine Frage über Server-Client-Kommunikation Netzwerkprogrammierung 5
K Client => Server Netzwerkprogrammierung 2
A ? Home-Network, Server/Client-Einrichtung Netzwerkprogrammierung 4
S Socket Server: ConnectionError vom Client erkennen Netzwerkprogrammierung 31
A Java Server - IOS Client Applikation Netzwerkprogrammierung 20
L Ratschlag zur Umsetzung einer client-server-Kommunikation Netzwerkprogrammierung 6
M RMI RMI Probleme zwischen Client und Server Netzwerkprogrammierung 5
J Erster Server-Client läuft auf lokalem Rechner problemlos. Zwei Rechner über das Internet nicht Netzwerkprogrammierung 8
N Client-Server-Datenbank Netzwerkprogrammierung 13
Kjubert Synchronisieren von Objekten über Client/Server - bester Weg? Netzwerkprogrammierung 7
B Client/Server Connection Problem Netzwerkprogrammierung 2
S Server Client Daten hin und herschicken Netzwerkprogrammierung 2
R Server zu Client Kommunikation Netzwerkprogrammierung 11
D TCP Verbindung (Java Client und Visual Basic Server) Netzwerkprogrammierung 12
S Socket Applet Client bekommt keine GLOBALE Verbindung zum Server Netzwerkprogrammierung 25
T Server und Client verbinden nicht Netzwerkprogrammierung 6
D Server Client Verbindung - Unexpected End of File - Invalid HTTP Response Netzwerkprogrammierung 4
V Socket UDP Server/Client Kommunikation sehr langsam Netzwerkprogrammierung 2
das-mo Client/Server sendet nicht Netzwerkprogrammierung 7
Z Socket Server/Client vernünftiger Verbindungsabbruch Netzwerkprogrammierung 4
G Bild über Socket schicken - Client/Server Netzwerkprogrammierung 10
F TCP Server/Client Netzwerkprogrammierung 14
M Problem Client - Server Sockets: .ready() wird nie true! Netzwerkprogrammierung 6
Ollek Socket Sucher passende Server/Client Lösung für meine Anwendung Netzwerkprogrammierung 2
N eine klasse mit server & client Netzwerkprogrammierung 5
D RMI Gui auf client updaten basierend auf den Property Änderung des Models auf dem Server ohne polling Netzwerkprogrammierung 12
T Socket Client versucht zyklische Verbindung zum Server Netzwerkprogrammierung 4
S Socket Einfache Client/Server-Anwendung Netzwerkprogrammierung 11
F Socket Server/Client Kommunikation Netzwerkprogrammierung 4
X Problem mit Server-Client-Kommunikation Netzwerkprogrammierung 14
D Projektstruktur / Architektur (Client-Server) Netzwerkprogrammierung 9
P Socket IRC Client nicht kompatibel mit Server Netzwerkprogrammierung 30
F FTP Client mit Sockets - wann sagt der Server nichts mehr? Netzwerkprogrammierung 7
B RMI Server - Client - Aufteilung/Prinzip Netzwerkprogrammierung 11
N Server Client TCP IP Netzwerkprogrammierung 3
M Übersicht client/server implementationen und Frameworks (mithilfe gesucht!) Netzwerkprogrammierung 6

Ähnliche Java Themen


Oben