# Inputstream Timeout



## MQue (10. Dez 2009)

Hallo,

in meiner Applikation verwende ich eine TCP Schnittstelle (Socket) um mich mit einem Remotegerät zu verbinden, Mittels OutputStream und InputStream sende und empfange ich die Daten. Das klappt so weit alles wunderbar.
Mein Problem liegt darin, ein reconnect zu machen, wenn ich eine gewisse Zeit lange auf einen Anfrage keine Antwort bekommen habe.
Das hat jetzt meiner Meinung nach nichts mit dem Socket- Timeout zu tun, das hat ich auch eingestellt und zieht, wenn keine Verbindung hergestellt werden konnte, hilft aber nichts, wenn die Verbindung besteht, das Remote- Gerät aber keine Daten mehr sendet.

Kennt jemand vielleicht ein Möglichkeit, wie ich auf dem InputStream einen Timeout setzen kann bzw. wie würdet ihr das am besten/resourcenschonensten machen in der unteren Methode (Timer, Thread?)

Methode zum Senden an Remote- Device: 

```
public void writeToRemote(final byte[] request) {
            try {
                outputStream.write(request);
                outputStream.flush();
                sendTime = System.currentTimeMillis();              // hier müsste ich dann einen Timer starten, um erkennen zu
können, dass nach einer Zeit x keine Daten zurückgekommen sind  
                }
            catch(SocketException ste) {
                System.out.println("SocketTimeoutException in SendThread run: " + ste);
                reconnect();
                }
            catch (Exception e) {
                e.printStackTrace();
                }
            }
```


----------



## MQue (10. Dez 2009)

Hab mir selber was geschrieben, vielleicht brauchts jemand:


```
private boolean infiniteLoop;
private Thread timeoutThread = null;
    private void connectionAlive(final boolean start) {
        infiniteLoop = start;
        
        if(infiniteLoop == false && timeoutThread != null) {
            timeoutThread.interrupt();
            }
        else {
            timeoutThread = new Thread() {
                @Override
                public void run() {
                    while(infiniteLoop) {
                        final long currentTime = System.currentTimeMillis();
                        if(currentTime > (sendTime+timeout)) {
                            infiniteLoop = false;
                            this.interrupt();
                            reconnect();
                            }
                        }
                    }
                };
            timeoutThread.start();
            }
        }
```


----------



## tuxedo (10. Dez 2009)

Du wirst nicht durm rum kommen das selbst im Protokoll zu verankern...

Im Fall von MINA (Apache MINA - Index) gibts ein "IDLE" event. Das wird ausgelöst wenn eine gewisse Zeitlang nichts mehr abgeschickt wurde. Damit triggere ich in meiner SIMON implementierung eine Ping-Nachricht die der Gegenüber mit einer Pong-Nachricht erwiedern muss. 

Beim absenden von Ping setze ich einen Timer. Beim Empfangen von Pong setze ich den Timer zurück. Läuft der Timer ganz durch weiß ich dass der Gegenüber nicht "in time" geantwortet hat und dass wohlmöglich ein Verindungsdefekt vorliegt.

Siehe hierzu auch: socket : Java Glossary

Gruß
Alex


----------

