# java.net.SocketException: Software caused connection abort: recv failed



## RealHAZZARD (4. März 2009)

Hallo,
ich habe mir eine Anwendung gebaut, die über einen gewissen Port wacht. Sinn ist es später einmal Eine Fernsteuerung der Anwendung möglich zu machen und bei erneuten start der Anwendung ein Indiz dafür zu haben, dass die Anwendung (Daemon) noch läuft und nicht noch einmal gestartet werden soll. 
Aber soweit bin ich noch nicht einmal. Ich bekomme immer eine SocketException, wenn der Client den Stream auslesen möchte.

Auszug meines Servers:

```
public void init(String[] args) throws ManagerException {
        try{
            serverSocket = new ServerSocket(RemoteAccessManager.PORT);
        }catch(IOException ioe){
            LoggingManager.getInstance().log(LogLevel.ERROR, ioe);
            setMr(new MonitoringReport(REPORTLEVEL.ERROR,"Remote access is not availible",id));
        }
        
        listen();
        setMr(new MonitoringReport(REPORTLEVEL.OK,null,id));
    }

private void listen(){
        for(int i=0;i<5;i++) addThread();
    }

private void addThread(){
        Thread t = new Thread(new ClientHanlder());
        t.setDaemon(true);
        t.start();
    }

private class ClientHanlder implements Runnable{
        @Override
        public void run() {
            try{
                Socket client = serverSocket.accept();
                
                InputStream is = client.getInputStream();
                OutputStream os = client.getOutputStream();
                byte[] bin = new byte[is.available()];
                String out = null;
                is.read(bin);
                String in = new String(bin);
                
                if(in != null){ 
                    if(in.equals(RemoteAccessProtocol.REQUEST_PING)) out = RemoteAccessProtocol.RESPONSE_PING;
                    else if (in.equals(RemoteAccessProtocol.REQUEST_STOP)) out = stopDaemon();
                }
                
                if(out != null){
                    os.write(out.getBytes());
                }
                
                is.close();
                os.close();
                client.close();
                client = null;
                setMr(new MonitoringReport(REPORTLEVEL.OK,null,id));
            }catch(IOException ioe){
                LoggingManager.getInstance().log(LogLevel.EXCEPTION,ioe);
                setMr(new MonitoringReport(REPORTLEVEL.WARN,ioe.getMessage(),id));
            }
            addThread();
        }
    }
```

Mein Client:

```
try{
            Socket testClient = new Socket("localhost",RemoteAccessManager.PORT);
            InputStream is = testClient.getInputStream();
            OutputStream os = testClient.getOutputStream();
            
            os.write(requestText.getBytes());
            os.flush();
            
            byte[] bin = new byte[1024];
            is.read(bin);    //Hier knallt es
            
            is.close();
            os.close();
            testClient.close();
            testClient = null;
            return new String(bin);
        }catch(IOException ioe){
            return null;
        }
```

Wenn ich die Serverseite debugge gibt es keine Auffälligkeiten. Der Server kann lesen was der Client schickt. Und so wie es zumindest aussieht, schick er auch die Ausgabe auf die Reise.
Ich verstehe nicht was das sein soll.
Habe auch schon den Virenschutz temporär deaktiviert, aber keine Besserung. 
Ich dachte vielleicht liegt es auch daran, dass ich auf Arbeit hinter einem Proxy sitze. Aber auch zuhause ging es nicht. 
Selbst wenn ich es mal nicht von localhost zu localhost versuche, sondern über einen entfernten Rechner tritt das Problem auf. 

Hiiiiiilllfffeeeee!


----------



## RealHAZZARD (17. März 2009)

So ich habe jetzt mal herausgefunden, warum das da oben  nicht will. Weil die Verbindung eher getrennt wird, als der Server mit der Übertragung fertig ist. Also weg mit dem close() und es geht.
Aber ich glaube ich bin nicht der Einzige  der findet, dass das nur eine schwache lösung sein kann. Ich möchte die Verbindung dennoch sauber schließen. 
Schematisch kann ich mir auch vorstellen wie das funktioniert. Aber technisch hängt es noch ein Bisschen. Ich hätte mir das wie folgt vorgestellt:
- Client startet Anfrage
- Server wertet sie aus und beantwortet sie
- Nun könnte man in Intervallen solange nachfragen, ob alles fertig ist, bis es dann endlich endlich soweit ist. Dann schließt man den socket.

Mein Problem ist nur, dass ich nicht weißt wo ich nach dem Status der übertragung frage.
Hat jemand Rat?


----------



## Thomas Darimont (17. März 2009)

Hallo,

warum verwendest du kein java.nio.channels.FileLock?

Gruß Tom


----------



## RealHAZZARD (18. März 2009)

Ich muss ehrlich gestehen, dass mir noch kein Tutorial unter die Augen gekommen ist, das mir den ganzen Vorgang ausreichend erklärt. Naja und um ehrlich zu sein, habe ich nach dieser Lösung auch nicht wirklich gesucht. Ich kann ja noch mal schauen, ob ich etwas finde. Ich kenne deine Beispiele auch schon, aber wie gesagt, da fehlt mir die Erklärung.


----------

