Я разрабатываю приложение Server-Client, и у меня возникла проблема с ожиданием ввода данных по входному потоку.Java InputStream ждет данных.
У меня есть поток, посвященный чтению входных данных. В настоящее время он использует цикл while, пока данные не будут доступны. (Протокол N.B. следующий: отправить размер пакета, скажем N, как int, а затем отправить N байтов).
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
}
}
Он работает, но блокирует поток, пока цикл - это ИМО, плохая идея. Я мог бы использовать Thread.sleep (X), чтобы предотвратить непрерывное потребление ресурсов циклом, но, безусловно, должен быть лучший способ.
Также я не могу полагаться на InputStream.read, чтобы заблокировать поток, поскольку часть данных может быть отправлена сервером с задержками. Я попытался, но это всегда приводило к неожиданному поведению.
Я бы признателен за любые идеи :)
InputStream.read уже блоки, когда данные отсутствуют , поэтому отмените метод 'available'. – UmNyobe