Client empfängt nichts vom Server

Hi ich sitz schon seit Tage an einem Client/Server Problem. Hab es dank der Forenhilfe auch sehr weit geschafft.
Leider empfängt mein Client nicht das was der Server im sendet. Woran liegt das?

Der Server ließt aus einer Datei Zeilenweise aus, jede Zeile soll an den Client übergeben werden. Warum klappt das nicht?

Danke im Voraus.

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

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

      while(true)
      {
        System.out.println("Warte auf Verbindung.");
        Socket s = server.accept();
        System.out.println("Verbunden.");
        (new ServerThread(s)).start();
      }
    }

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

class ServerThread extends Thread
{
  Socket s;
  Socket c;

  public ServerThread(Socket s) throws Exception
  {
    this.s = s;
    runServer();
  }

  void runServer()
  {
    try
    {
      c = s;
      System.out.println("Befehl lesen.");
      befehllesen(c);
    }

    catch(Exception e)
    {
      System.out.println("Server error");
    }
  }

  void befehllesen(Socket c)
  {
    try
    {
      BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
      String empfangen = in.readLine();
      String [] enpfangenspliten = empfangen.split("§");
      String befehl = enpfangenspliten[0];
      String datensatz = enpfangenspliten[1];
      String befehlanlegen = "anlegen";
      String befehlanzeigen = "anzeigen";
      String befehlsuchen = "suchen";

      if (befehl.equals(befehlanlegen))
      {
        System.out.println("Befehl: " + befehl);
        System.out.println("Datensatz empfangen: " + datensatz);
        BufferedWriter outanlegen = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("Pruefplaene.txt", true)));
        outanlegen.write(datensatz);
        outanlegen.newLine();
        outanlegen.flush();
        System.out.println("Empfangener Datensatz wurde erfolgreich in die Datei 'Pruefplaene.txt' geschrieben.");
        outanlegen.close();
      }

      else if (befehl.equals(befehlanzeigen))
      {
        System.out.println("Befehl: " + befehl);
        BufferedReader inanzeigen = new BufferedReader(new InputStreamReader(new FileInputStream("Pruefplaene.txt")));

        String strAnzeigenLine;

        while((strAnzeigenLine = inanzeigen.readLine()) != null)
        {
          System.out.println(strAnzeigenLine);
          BufferedWriter outanzeigen = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
          outanzeigen.write(strAnzeigenLine);
          outanzeigen.newLine();
          outanzeigen.flush();
        }
      }

      else if (befehl.equals(befehlsuchen))
      {
        System.out.println("Befehl: " + befehl);
        BufferedReader inspeichern = new BufferedReader(new InputStreamReader(new FileInputStream("Pruefplaene.txt")));

        String strSpeichernLine;
        BufferedWriter outSpeichernDatei = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("Suchen.txt")));
        String leerspeichern = "";
        outSpeichernDatei.write(leerspeichern);
        outSpeichernDatei.flush();

        while((strSpeichernLine = inspeichern.readLine()) != null)
        {
          System.out.println(strSpeichernLine);
          BufferedWriter outsuchen = new BufferedWriter(new FileWriter("Suchen.txt", true));
          outsuchen.write(strSpeichernLine);
          outsuchen.newLine();
          outsuchen.flush();
        }

        BufferedWriter outsuchen = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        outsuchen.write(datensatz);
        outsuchen.newLine();
        outsuchen.flush();
        outsuchen.close();
      }
    }

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

Client:
Code:
package anzeigen;

import java.awt.*;
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
{
  String[] Spaltennamen = {"Getriebetyp", "Nummer", "Art", "Dokumentiert", "Prüfmittel", "Messbereich", "Prüfablauf", "Prüfergebnis"};
  DefaultTableModel AnzeigenTabelle;
  JComponent contentPane = (JComponent) getContentPane();

  Prüfpläneanzeigen()
  {
    super("Alle Prüfpläne anzeigen");
    AnzeigenLayout();
    ClientThreadanzeigen ctanzeigen = new ClientThreadanzeigen();
  }

  void AnzeigenLayout()
  {
    contentPane.setLayout(new BorderLayout());
    createAnzeigenMenuleiste();

    AnzeigenTabelle = new DefaultTableModel(null, Spaltennamen);
    JTable tblAnzeigen = new JTable(AnzeigenTabelle);
    tblAnzeigen.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);

    JScrollPane scrollPane = new JScrollPane(tblAnzeigen);
    scrollPane.setPreferredSize(new Dimension(785, 500));

    JPanel panelAnzeigenTable = new JPanel();
    panelAnzeigenTable.add("Center", scrollPane);
    contentPane.add("West", panelAnzeigenTable);

    JButton btnAnzeigenOK = new JButton("OK");
    btnAnzeigenOK.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        closeAnzeigenWindow();
      }
    });

    JPanel panelAnzeigenButton = new JPanel();
    panelAnzeigenButton.add(btnAnzeigenOK);
    contentPane.add("South", panelAnzeigenButton);
  }

  private void createAnzeigenMenuleiste()
  {
    JMenuBar Anzeigenleiste = new JMenuBar();
    JMenu AnzeigenProgramm = new JMenu("Programm");

    JMenuItem AnzeigenEnde = new JMenuItem("Beenden");

    AnzeigenProgramm.add(AnzeigenEnde);
    
    AnzeigenEnde.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        closeAnzeigenProgramm();
      }
    });

    Anzeigenleiste.add(AnzeigenProgramm);
    setJMenuBar(Anzeigenleiste);
  }
  
  void closeAnzeigenProgramm()
  {
    System.exit(0);
  }

  void closeAnzeigenWindow()
  {
    this.setVisible(false);
  }

  public static void Prfanzeigen()
  {
    Prüfpläneanzeigen Anzeigen = new Prüfpläneanzeigen();
    Anzeigen.setLocation(100, 100);
    Anzeigen.setSize(800, 600);
    Anzeigen.setResizable(false);
    Anzeigen.setVisible(true);
  }

  class ClientThreadanzeigen extends Thread
  {
    ClientThreadanzeigen()
    {
      senden();
    }

    public void senden()
    {

        try
      {
        Socket s = new Socket("localhost", 1234);

        BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        String anzeigen = "anzeigen§ ";
        out.write(anzeigen);
        System.out.println("Sende Anzeigebefehl an Server Port 1234.");
        out.newLine();
        out.flush();
        out.close();
      

          BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
        String gelesen;
        gelesen = in.readLine();
        System.out.println(gelesen);

        //readTable();
        //System.out.println("Datensätze erfolgreich in Tabelle ausgegeben.");
      }

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

      catch (IOException io)
      {
        io.printStackTrace();
      }
    }
    
   /* void readTable()
    {
      try
      {


        String strAnzeigenLine;
        while((strAnzeigenLine = Anzeigenreader.readLine()) != null)
        {
          String[] AnzeigenSplit = strAnzeigenLine.split(";");
          AnzeigenTabelle.addRow(AnzeigenSplit);
        }
        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 'Pruefplaene.txt' wurde nicht gefunden.", "Fehlermeldung", JOptionPane.ERROR_MESSAGE);
      }

      catch(IOException e)
      {
        JOptionPane.showMessageDialog(null, "Sie besitzen keinen Lesezugriff auf die Datei 'Pruefplaene.txt'.", "Information", JOptionPane.INFORMATION_MESSAGE);
      }
    } */
  }
}
 
Also, ich habe nur kurz darüber geschaut, aber ich glaube Dein Problem ist, das SDein Server nicht die Run-Methode von Thread überschreibt. Diese wird automatisch aufgerufen, nachdem die Methode start den Thread initialisiert hat, nur "run" läuft nebenläufig.

also schmeiss den Aufruf RunServer aus dem Konstruktor und benenne die Funktion von runserver schlicht in run um.

Gruss
 
Hi,

habe an Deiner Logik nix geändert. Nur das Socketzeug habe ich umgebaut. Den Client habe ich mir noch nicht zur Brust genommen, aber der Server läuft bis auf "Suchen" da hatte ich keine Lust mehr. Ist mit Telnet getestet. "telnet localhost 1234"

Den § musste ich durch : ersetzen, weil das doofe Dosfenster (falsche Code-Page) von Telnet die Zeichen nicht richtig erkennt.

Java:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

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

			while (true) {
				System.out.println("Warte auf Verbindung.");
				Socket s = server.accept();
				System.out.println("Verbunden.");
				(new ServerThread(s)).start();
			}
		}

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

class ServerThread extends Thread {
	private static final String ANLEGEN = "anlegen";
	private static final String ANZEIGEN = "anzeigen";
	private static final String SUCHEN = "suchen";
	private static final String ENDE = "bye";

	private Socket s;
	private BufferedReader in;
	private PrintWriter out;

	public ServerThread(Socket s) throws Exception {
		this.s = s;
		in = new BufferedReader(new InputStreamReader(s.getInputStream()));
		out = new PrintWriter(s.getOutputStream());
	}

	public void run() {
		try {
			String empfangen;
			String datensatz="";
			
			while ((empfangen = in.readLine()) != null) {
				// Als Trenner habe ich : genommen weil § bei telnet Ärger
				// macht, kannst Du wieder tauschen
				String[] empfangenspliten = empfangen.split(":");
				String befehl = empfangenspliten[0];
				if(empfangenspliten.length > 1)
					datensatz = empfangenspliten[1];
				
				if (befehl.equalsIgnoreCase(ENDE)) break;
				if (befehl.equalsIgnoreCase(ANLEGEN)) anlegen(datensatz);
				if (befehl.equalsIgnoreCase(ANZEIGEN)) anzeigen();
				if (befehl.equalsIgnoreCase(SUCHEN)) suchen();
			}

		}

		catch (Exception e) {
			System.out.println("Server error: " + e.getMessage());
		}
	}

	private void suchen() {
		// TODO Auto-generated method stub
		System.out.println("Dazu hatte ich keine Lust mehr!");
	}

	private void anzeigen() throws Exception {
		
		 BufferedReader inanzeigen = new BufferedReader(new InputStreamReader(new FileInputStream("Pruefplaene.txt")));
		 String strAnzeigenLine;
		 
		 while((strAnzeigenLine = inanzeigen.readLine()) != null) {
			 System.out.println(strAnzeigenLine);
		 
			 out.println(strAnzeigenLine);
		  
			 out.flush(); 
		 } 
		 inanzeigen.close(); 
			
		
	}

	private void anlegen(String datensatz) throws Exception{
		
		System.out.println("Datensatz zum Anlegen empfangen: " + datensatz);
				  
		BufferedWriter outanlegen = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("Pruefplaene.txt", true)));
	    outanlegen.write(datensatz); 
	    outanlegen.newLine();
		outanlegen.flush(); System.out.println("Empfangener Datensatz wurde erfolgreich in die Datei 'Pruefplaene.txt' geschrieben.");
	    outanlegen.close(); 
		
	}

	
}

Gruss

P.S. Anzeigen und Anlegen habe ich von der Logik verstanden. Was macht aber suchen? Soll die so funktionieren, oder ist die noch nicht fertig?
 
Zuletzt bearbeitet:
Zurück