Pracuję nad aplikacją Server-Client i mam problem z oczekiwaniem na dane wejściowe w strumieniu wejściowym.Java InputStream czekać na dane.
Mam wątek przeznaczony do odczytu danych wejściowych. Obecnie wykorzystuje pętlę while do przechowywania danych. (Protokół N.B. jest następujący: wyślij rozmiar pakietu, powiedz N, jako int, następnie wyślij N bajtów).
public void run(){
//some initialization
InputStream inStream = sock.getInputStream();
byte[] packetData;
//some more stuff
while(!interrupted){
while(inStream.available()==0);
packetData = new byte[inStream.read()];
while(inStream.available()<packetData.length);
inStream.read(packetData,0,packetData.length);
//send packet for procession in other thread
}
}
Działa, ale blokowanie wątku przez pętlę while jest IMO złym pomysłem. Mogę użyć Thread.sleep (X), aby zapobiec ciągłemu zużyciu zasobów przez pętlę, ale na pewno musi być lepszy sposób.
Również nie mogę polegać na InputStream.read, aby zablokować wątek, ponieważ część danych może być wysyłana przez serwer z opóźnieniami. Próbowałem, ale zawsze powodowało nieoczekiwane zachowanie.
będę wdzięczny za wszelkie pomysły :)
InputStream.read już bloki, gdy dane nie są dostępne . więc odrzuć metodę 'available'. – UmNyobe