Kann nicht Daten vom Server lesen Socket

  • Themenstarter Themenstarter ZeusSeinGrossopa
  • Beginndatum Beginndatum
Z

ZeusSeinGrossopa

Gast
Hi,

ich habe einen Socket Server programmiert. Dort funktioniert alles mit Daten versenden oder Daten lesen.
Beim Client jedoch kann man Daten an den Server versenden, aber keine Daten von dem Server lesen.

Dies ist die Fehlermeldung:

[Thread-7/INFO]: [STDERR] at java.net.SocketException: Socket closed [Thread-7/INFO]: [STDERR]: at java.net.SocketInputStream.socketRead0(Native Method) [Thread-7/INFO]: [STDERR]: at java.net.SocketInputStream.socketRead(Unknown Source) [Thread-7/INFO]: [STDERR]: at java.net.SocketInputStream.read(Unknown Source) [Thread-7/INFO]: [STDERR]: at java.net.SocketInputStream.read(Unknown Source) [Thread-7/INFO]: [STDERR]: at sun.nio.cs.StreamDecoder.readBytes(Unknown Source) [Thread-7/INFO]: [STDERR]: at sun.nio.cs.StreamDecoder.implRead(Unknown Source) [Thread-7/INFO]: [STDERR]: at sun.nio.cs.StreamDecoder.read(Unknown Source) [Thread-7/INFO]: [STDERR]: at java.io.InputStreamReader.read(Unknown Source) [Thread-7/INFO]: [STDERR]: at java.io.BufferedReader.fill(Unknown Source) [Thread-7/INFO]: [STDERR]: at java.io.BufferedReader.readLine(Unknown Source) [Thread-7/INFO]: [STDERR]: at java.io.BufferedReader.readLine(Unknown Source) [Thread-7/INFO]: [STDERR]: at de.database.SocketReader.run(SocketReader.java:37)

Wenn
reader.readLine();
ausgeführt wird, dann schließt sich der Socket.

Mein Code:
Java:
        try {
            InputStream in = socket.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
           
            while(!socket.isClosed()) {
                String s = reader.readLine();
                if(s != null) {
                    System.out.println("Nachricht vom Server: " + s);
                }
            }
        } catch(IOException e) {
            e.printStackTrace();
        }

Kann mir jemand helfen den Fehler zu beheben, das ich die Daten lesen kann und der Socket nicht geclosed wird?

Danke für eure Hilfe!
 
Zeig den Code vom Server. Und ggf. noch mehr vom Client um zu sehen, was da jeweils komplett gemacht wird.

Die Fehlermeldung besagt, dass der Socket geschlossen wurde. Also entweder schließt der Server die Verbindubg aktiv, oder es gibt einen Timeout (wobei ich gerade nicht ganz sicher bin, ob da die Meldung nicht etwas anders wäre).
 
Hier ist der Code vom Server:
Java:
try {
            ServerSocket server = new ServerSocket(6458);
            System.out.println("Der Server wurde gestartet!");
            while(true) {
                Socket client = server.accept();
                
                OutputStream out = client.getOutputStream();
                PrintWriter writer = new PrintWriter(out);
                
                
                InputStream in = client.getInputStream();
                BufferedReader reader = new BufferedReader(new InputStreamReader(in));
                
                    String s = reader.readLine();
                    if(s != null) {
                        System.out.println("Empfangen vom Client: " + s);
                        writer.write(reply + "\n");
                        writer.flush();       
                    }
            }
        } catch(SocketException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
 
Der Server liest erst eine Nachricht um dann etwas zurück zu schicken. Danach wird nichts weiter gemacht. (Also der socket wird dann geschlossen, wenn der GC dazu kommt...)

Schreibt Dein Client denn eine Nachricht an den Server? Wenn nichts geschrieben wird, dann würden Server und Client warten, dass etwas kommt.

Wenn der Client erst etwas schickt, dann kommt auch eine Nachricht zurück. Danach macht der Server nichts mehr und der Spcket wird früher oder später geschlossen. Der Cliebt wartet aber in der Schleife und wenn dann die Connection geschlossen wird, dann kommt die Exceotion...

Die zwei Möglichkeiten sehe ich derzeit.

Der Server sollte vernünftig mit den Sockets und Streas umgehen und am Ende der Nutzung alles schließen. Desweiteren solltest du überlegen auf async Verarbeitung zu setzen. Wenn ein Client sich verbindet aber nichts sendet, dann blockiert der Server. Weitere Clients können sich in der Zeit nicht verbinden ...

Was den Client angeht ist die Frage, wie das Protokoll aussehen soll. Derzeit macht die Schleife beim Empfang keinen Sinn, denn es ist aus Client Sicht genau eine Nachricht (Zeile) zu senden um dann genau eine Zeile zu lesen.
 
Schreibt Dein Client denn eine Nachricht an den Server? Wenn nichts geschrieben wird, dann würden Server und Client warten, dass etwas kommt.

Ich hab es halt vor das die ganze Zeit der Client nach neuen Daten von dem Server sucht. So hab ich mein System programmiert:
Ich will eine Information von dem Server bekommen. Dann wird ein String mit der Anfrage zu dem Server geschickt. Der Server schickt dann die Information zum Client.
 
Dann musst du das so schreiben. Wenn der Server die Information in einer Zeile zurück sendet, dann brauchst Du kein while(!socket.isClosed()) sondern nur ein einzelnes readLine.

Das wäre eine Idee.
 
Und wie soll ich es programmieren?

So funktioniert es auch nicht:
Java:
            String s = null;
            while((s = reader.readLine()) != null) {
                System.out.println("Nachricht vom Server: " + s);
            }
 
Keine Whileschleife, du musst
1. Eine Zeile an den Server senden
2. Eine Zeile vom Server lesen

Das wäre sozusagen jetzt Dein Protokoll, wenn man so will.
 
Ja, eine Zeile an den Server funktioniert aber die Zeile von dem Server abzulesen kann ich nicht. Deshalb weiß ich gerade auch nicht mehr weiter wie ich sonst Zeilen von dem Server lesen kann.
 
Was hast du denn jetzt im Client geändert? Zeig da mal den ganzen Code.

Und was ist reply im Server? Das ist ja, was du zurück sendest.
 
Ich hab das beim Server wegelassen:
Java:
String reply = manager.onRequest(s);
Dies ist dazu da das die information zurückgesendet wird, die der Client braucht.

Hier ist noch der Client Code:
Java:
Socket socket = new Socket(DATABSE_IP, DATABASE_PORT);
this.socket = socket;
thread = new SocketReader(packetManager, socket);
thread.start();

Socketreader Klasse:
Java:
public class SocketReader extends Thread {
    
    private PacketManager packetManager;
    private Socket socket;
    
    public SocketReader(PacketManager packetManager, Socket socket) {
        this.packetManager = packetManager;
        this.socket = socket;
    }
    
    @Override
    public void run() {
        try {
            InputStream in = socket.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
            
            String s = reader.readLine();
            if(s != null) {
                packetManager.incomingMessage(s); //Gibt die Daten weiter
                System.out.println("Nachricht vom Server: " + s);
            }
        } catch(IOException e) {
            e.printStackTrace();
        }
        
    }
}
 

Neue Themen


Zurück
Oben