Tôi đang phát triển ứng dụng Máy khách-Khách hàng và tôi gặp sự cố khi đợi dữ liệu đầu vào trên luồng đầu vào.Java InputStream chờ dữ liệu.
Tôi có chủ đề dành riêng cho việc đọc dữ liệu đầu vào. Hiện tại, nó sử dụng vòng lặp trong khi giữ cho đến khi dữ liệu có sẵn. (N.B. giao thức là như sau: gửi kích thước của gói tin, nói N, như int sau đó gửi N byte).
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
}
}
Nó hoạt động nhưng chặn luồng theo vòng lặp trong khi IMO là một ý tưởng tồi. Tôi có thể sử dụng Thread.sleep (X) để ngăn chặn các tài nguyên liên tục được tiêu thụ bởi vòng lặp, nhưng chắc chắn phải có một cách tốt hơn.
Ngoài ra tôi không thể dựa vào InputStream.read để chặn luồng như một phần của dữ liệu có thể được gửi bởi máy chủ với sự chậm trễ. Tôi đã thử nhưng nó luôn dẫn đến hành vi bất ngờ.
Tôi đánh giá cao bất kỳ ý tưởng :)
InputStream.read đã chặn khi dữ liệu không có sẵn . do đó, loại bỏ phương thức 'sẵn có'. – UmNyobe