मैं सर्वर-क्लाइंट एप्लिकेशन विकसित कर रहा हूं और मुझे इनपुट स्ट्रीम पर इनपुट डेटा की प्रतीक्षा करने में समस्या है।जावा इनपुटस्ट्रीम डेटा के लिए प्रतीक्षा करें।
मेरे पास इनपुट डेटा पढ़ने के लिए समर्पित धागा है। वर्तमान में यह डेटा उपलब्ध होने तक लूप को पकड़ने के दौरान उपयोग करता है। (एनबी प्रोटोकॉल निम्नानुसार है: पैकेट का आकार भेजें, एन कहें, int के रूप में फिर एन बाइट्स भेजें)।
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) का उपयोग कर सकता हूं, लेकिन निश्चित रूप से एक बेहतर तरीका होना चाहिए।
इसके अलावा मैं डेटा के हिस्से के रूप में थ्रेड को अवरुद्ध करने के लिए इनपुटस्ट्रीम.read पर भरोसा नहीं कर सकता, सर्वर द्वारा देरी के साथ भेजा जा सकता है। मैंने कोशिश की है लेकिन यह हमेशा अप्रत्याशित व्यवहार में हुआ।
मैं किसी भी विचार की सराहना करेंगे :)
InputStream.read पहले से ही ब्लॉक जब डेटा उपलब्ध नहीं है । तो 'उपलब्ध' विधि को त्यागें। – UmNyobe