# Kann nicht Daten vom Server lesen Socket



## ZeusSeinGrossopa (18. Aug 2020)

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:

```
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!


----------



## kneitzel (18. Aug 2020)

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).


----------



## ZeusSeinGrossopa (18. Aug 2020)

Hier ist der Code vom Server: 

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


----------



## kneitzel (18. Aug 2020)

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.


----------



## ZeusSeinGrossopa (18. Aug 2020)

JustNobody hat gesagt.:


> 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.


----------



## kneitzel (18. Aug 2020)

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.


----------



## ZeusSeinGrossopa (18. Aug 2020)

Und wie soll ich es programmieren? 

So funktioniert es auch nicht: 

```
String s = null;
            while((s = reader.readLine()) != null) {
                System.out.println("Nachricht vom Server: " + s);
            }
```


----------



## kneitzel (18. Aug 2020)

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.


----------



## ZeusSeinGrossopa (18. Aug 2020)

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.


----------



## kneitzel (18. Aug 2020)

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.


----------



## ZeusSeinGrossopa (19. Aug 2020)

Ich hab das beim Server wegelassen: 

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

```
Socket socket = new Socket(DATABSE_IP, DATABASE_PORT);
this.socket = socket;
thread = new SocketReader(packetManager, socket);
thread.start();
```

Socketreader Klasse: 

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


----------

