ready() funktioniert nicht



  • Hallo,
    folgendes Problem:

    Bei einer Client-Server-Anwendung weigert sich die Funktion ready() meines BufferedReaders des Servers true zurückzugeben obwohl definitiv Daten vorhanden sind.

    if(mReader.ready())
    {
       String vLine = mReader.readLine();
       setChanged();
       notifyObservers(vLine);
       mLogger.log2Console("Nachricht von " + mName + " empfangen");
    }
    else
    {
       Thread.sleep(mWait);
    }
    

    Dieser Code führt dazu, dass der If-Block nie aufgerufen wird. Wenn ich die Prüfung auf ready entferne werden die richtigen Daten aus dem Stream ausgelesen.

    Danke schomal



  • Wie wäre es mit:

    [java]
    String s = null;
    if ((s=mReader.readLine())!= null){
    //do something
    }
    else { }



  • Das Problem ist das ein read auf den Eingangsstream blockiert, d.h. das der Programmablauf solange gestoppt wird bis eine Eingabe kommt.

    Das Problem, auf das ich gestoßen bin ist folgendes:
    - der Server erreicht readLine, blockiert und wartet auf die nächste Eingabe
    - der Client stürzt ab
    - der Server waretet...und wartet...und wartet

    Mit ready wollte ich das Problem insofern umgehen indem ich nur read aufrufe wenn auch wirklich Daten da sind. Sinn und Zweck der Sache war ursprünglich um einen Absturz des Clients zu erkennen.

    Allerdings war ich wahrscheinlich um 3Uhr nachts doch nichtmehr ganz in der Lage an die einfachen Lösungen ala Socket-Timeout zu denken, heisst ich konnte das Problem anderweitig lösen.

    Trotzdem würde mich interessieren warum ready() in diesem Kontext nicht das tut was es eigentlich soll.



  • sorry, ist zwar offtopic, mir st nur gerade dein sig aufgefallen, kenrik.
    seit wann ist (-1)^(2 * 0,5) = ((-1)2)0,5 😃



  • würd einfach mal reinsteppen und mir angucken, auf was ready tatsächlich prüft. finde die beschreibung in der java doc nicht gerade sehr eindeutig.

    [quote]seit wann ist (-1)^(2 * 0,5) = ((-1)2)0,5{/quote]
    seit man damit beweisen kann, dass -1 = 1 gilt 😉


Log in to reply