readXYZ von DataInputStream abbrechen/timeout auslösen

mabuhay

Bekanntes Mitglied
Hallo

Ich habe eine DataInputStream-Klasse in welcher verschiedene read-Methoden (readByte, readInt, readDouble, etc) implementiert sind. Ich kann über eine Methode setStreamType() die read-Methode wählen und somit die Daten entsprechend auslesen.

Nun ist es aber so, dass die read-Methode blockiert und nach dem ändern des Streams mit setStreamType() die "alte" read-Methode noch auf Daten wartet, bis das timeout eintritt.

Ist es nun irgendwie möglich, den timeout auszulösen oder die read-Methode anderweitig abzubrechen? Es wäre natürlich auch möglich in der setStreamType()-Methode auf das timeout zu warten, ist aber natürlich nicht so schön wenns dort blockiert.

mfg
 
Hört sich nach Design/Implementierungsfehler an. Du kannst nicht während der DataInputStream gerade mit read...() auf Input wartet, plötzlich Dich entscheiden doch lieber mit readInt() einzulesen.
 
Naja, dann brauche ich eine bessere idee 😛

Ich habe einen Client welcher Daten über einen zweiten Kanal anfordert, also zum Beispiel 100 Integerdaten. Diese angeforderten Daten werden dann vom Server gesendet und der Client liest die Daten mit readInt(). Die nächsten angeforderten Daten werden aber als double-Werte gesendet. Da der Client die Daten anfordert, kann die Lesemethode also auf readDouble() umgestellt werden und nach dem Anfragen der Daten sendet der Server die double-Werte und sie werden vom Client mit readDouble() gelesen. Es ist also nicht so dass während dem Daten gesendet werden die read-Methode einfach umgestellt wird.

Ich habe mir schon überlegt in einer Schleife mit in.available() zu Testen ob Daten verfügbar sind und wenn nicht den Empfangs-Thread warten lassen. Dann hab ich aber eine Verzögerung beim Datenempfang falls Daten kommen wenn der Thread gerade am warten ist. Also wenn auf readInt() gestellt ist und gerade keine Daten kommen wartet der Thread. Wenn jetzt wieder integer-Werte empfangen werden muss die Wartezeit zuerst ablaufen. Falls also mal kurzzeitig keine Daten verfügbar sind würde der Thread warten, die Daten müssen aber möglichst kontinuierlich dargestellt werden darum wäre dieser Fall nicht so toll..

Was gäbe es sonst noch für eine Idee zur Umsetzung?

mfg
 
Es gibt eben zwei Modi, einen wo der Client eine bestimmte Anzahl Daten anfordert und den zweiten wo Daten empfangen werden bis wieder Stop gesendet wird... aber ja, da der Client ja Start/Stop kontrolliert kann ich den Empfangsthread in den Wartezustand setzen sobald ein Stop gesendet wurde oder die Anzahl Daten empfangen wurden. Und dann vor der nächsten Datenanfrage kann ich zuerst die read-Methode wählen und danach den Empfangsthread wieder aufwecken.

Vielen Dank für den Denkanstoss, werds gerade mal ausprobieren 🙂

mfg
 
Bei Netzwerkkommunikation arbeitet man üblicherweise mit einem Protokoll. Der Server könnte ja in den ersten x Bytes eine Info darüber senden, von welchem Typ die kommenden Daten sind und wieviele Datenobjekte gesendet werden.
 
Ja das ist mir klar. Ein Kanal ist der Control-Kanal, darüber läuft ein Protokoll. Der andere Kanal ist aber nur für Daten bestimmt und soll so wenig overhead haben wie möglich. Natürlich wäre es nicht viel overhead wenn nur anfangs der Daten die Information über das Datenformat gesendet wird, mein Problem war aber hauptsächlich das umwandeln der Bytes in zum Beispiel Float oder Double, und mit dem DataInputStream geht das sehr praktisch. Habs auch anderst hingekriegt aber nicht so "elegant".

mfg
 

Zurück
Oben