Stream Read Timeout

Danielku15

Erfahrenes Mitglied
Hi Leute.
Ich arbeite gerade an einem kleinen Netzwerkprotokoll. (Simple 7 Befehle die Verfügbar sind). Nur habe ich ein Problem mit dem Command IN. Wenn IN an den Client geschickt wird, signalisiert dies am Client dass eine Texteingabe benötigt wird. Gut kein Problem. Server schickt IN an den Client und beginnt darauf am InputStream des Sockets zu lesen. Nur ein Problem hab ich jetzt. Wie ihr wisst blockiert der Read Befehl solange bis die benötigten Bytes angekommen sind. Ich will aber nun falls innerhalb einer bestimmten Zeit keine Antwort kommt dass der Befehl mit einer Exception abbricht.
So wie es auch mit der accept() Methode der Klasse ServerSocket.

Wie kann ich das lösen? Theoretisch kann ich ein Timer setzen der dafür sorgt dass eine Exception ausgeworfen wird. aber wie mach ich es dass die read Methode abgebrochen wird. Ich hab wo gelesen dass ich über die close() Methode den Befehl abbrechen kann. Aber dann wäre die ganze Connection weg. Und das will ich nicht.

Wisst ihr wie ich das nun anstelle?

[Edit]
So entweder ich habs jetzt oder ich hab noch ein Fehler in meiner Überlegung: Ich lese die einzelnen Bytes mittels eigener Methode read() (Man könnte auch eine Klasse ableiten und die read Methode dann überschreiben) in welcher ich überprüfe ob ein Byte im Datenstrom liegt. Wenn nicht checke ich ob der Timeout überschritten wurde und werfe nach bedarf eine Exception aus:

Java:
    /**
     * Erwartet eine Eingabe des Clients
     * @return der String welcher eingegeben wurde.
     * @throws IOException Wird ausgelöst wenn der Timeout beim lesen eines Bytes überschritten wird. 
     *
     */
    private String IN() throws IOException
    {
        SendString("IN"); // Client auf Anfrage benachrichtigen
        int iRead = 0;
        String sResult = "";
        do
        {
            iRead = read();
            if((char)iRead != '\0')
            {
                sResult += (char)iRead;
            }            
        } while((char)iRead != '\0'); // Bis zum \0 lesen        
        return sResult;
    }

    /**
     * Liest ein Byte vom Client.
     * @return das gelesene Byte.
     * @throws IOException Wird ausgelöst wenn der Timeout überschritten wurde.
     */
    private int read() throws IOException
    {
        InputStream oIn = _oClient.getInputStream();
        // Timeoutzeit berechnen
        long iCurrent = System.currentTimeMillis() + getTimeout();
        // Solange keine Bytes vorhanden sind auf Timeout checken
        while (oIn.available() == 0)
        {
            // Wenn die Zeit überschritten ist
            if (System.currentTimeMillis() >= iCurrent)
            {
                throw new IOException("Read Timeout");
            }
        }
        return oIn.read();
    }

Konnte es noch nicht testen da das Modul noch nicht soweit ist. Aber ich denke es würde funktionieren.


Gruß Daniel
 
Zuletzt bearbeitet:
Zurück