2013-03-20 5 views
5

readLine() का उपयोग करते हुए डेटा प्राप्त करते समय, संदेश संदेश भेजने पर .flush का उपयोग करते हुए संदेश के अंत में "\ n" डालने के बावजूद, जबकि मेरे संदेश को पढ़ने के दौरान लूप जो अभी भी ब्लॉक करता है । सॉकेट कनेक्शन बंद करते समय, यह लूप छोड़ देता है।BufferedReader readLine() ब्लॉक

bos = new BufferedOutputStream(socket. 
      getOutputStream()); 
bis = new BufferedInputStream(socket. 
      getInputStream()); 
osw = new OutputStreamWriter(bos, "UTF-8"); 
osw.write(REG_CMD + "\n"); 
osw.flush(); 

isr = new InputStreamReader(bis, "UTF-8"); 
BufferedReader br = new BufferedReader(isr); 

String response = ""; 
String line; 

while((line = br.readLine()) != null){ 
    response += line; 
} 

और सर्वर के कोड:

BufferedInputStream is; 
BufferedOutputStream os; 

is = new BufferedInputStream(connection.getInputStream()); 
os = new BufferedOutputStream(connection.getOutputStream()); 

isr = new InputStreamReader(is); 

String query= ""; 
String line; 

while((line = br.readLine()) != null){ 
    query+= line; 
} 

String response = executeMyQuery(query); 
osw = new OutputStreamWriter(os, "UTF-8"); 

osw.write(returnCode + "\n"); 
osw.flush(); 

मेरे सर्वर पर कोड ब्लॉक, जबकि पाश

यहाँ ग्राहक कोड है। धन्यवाद।

+0

अपने कोड को कोशिश/पकड़ ब्लॉक में रखें और अंत में ब्लॉक में स्ट्रीम/कनेक्शन बंद करें। – happy

+1

इसमें ऐसा कोई प्रतीत नहीं होता है। क्या आप जानना चाहते हैं कि यह व्यवहार क्यों होता है? इसे कैसे रोकें? – Sinkingpoint

+1

यदि आप लूप के दौरान उपयोग करने के लिए केवल एक पंक्ति पढ़ना चाहते हैं? –

उत्तर

10

BufferedReader अंत तक पहुंचने तक इनपुट को पढ़ना जारी रखेगा (फ़ाइल या स्ट्रीम या स्रोत आदि का अंत)। इस मामले में, 'अंत' सॉकेट का समापन है। इसलिए जब तक सॉकेट कनेक्शन खुलता है, आपका लूप चलाएगा, और BufferedReader बस अधिक इनपुट की प्रतीक्षा करेगा, प्रत्येक बार '\ n' तक पहुंचने पर लूपिंग होगा।

+0

mmm मुझे नहीं लगता था कि अंत सॉकेट का समापन था। धन्यवाद।अब जब मैं इसे देखता हूं, तो मैंने डॉक्टर को गलत तरीके से पढ़ा! – Majid

+0

जब गैर-फाइल धाराओं के लिए ईओफ़ की बात आती है तो दस्तावेज़ अपेक्षाकृत संदिग्ध होता है। – Sinkingpoint

+0

यह ओपी का लूप है जो ईओएस तक पढ़ता रहता है, न कि BufferedReader। – EJP

3

यह जबकि पाश में हालत की वजह से है: while((line = br.readLine()) != null)

आप हर यात्रा पर एक पंक्ति पढ़ सकते हैं और पाश leve अगर ReadLine रिटर्न null

रीडलाइन केवल शून्य हो जाती है, अगर ईओफ़ पहुंच गया है (= सॉक बंद है) और एक '\ n' पढ़ा जाता है तो स्ट्रिंग देता है।

अगर आप ReadLine पर पाश से बाहर निकलना चाहते हैं, तो आप पूरे जबकि लूप und छोड़ सकते हैं बस करो:

line = br.readLine()

+0

धन्यवाद, मैं कोशिश कर सकता हूं। – Majid

0

तुम्हारे बिना क्या सॉकेट में है प्राप्त करना चाहते हैं, तो इसे बंद करने के लिए मजबूर किया जा रहा बस ObjectInputStream और ObjectOutputStream का उपयोग ..

उदाहरण:

ObjectInputStream ois; 
ObjectOutputStream oos; 

ois = new ObjectInputStream(connection.getInputStream()); 

String dataIn = ois.readUTF(); //or dataIn = (String)ois.readObject(); 

oos = new ObjectOutputStream(connection.getOutputStream()); 
oos.writeUtf("some message"); //or use oos.writeObject("some message"); 
oos.flush(); 

..... 
0

ऐसा इसलिए होता है क्योंकि इनपुटस्ट्रीम लाल होने के लिए तैयार नहीं है, इसलिए यह inreadLine() पर अवरुद्ध होता है। इस प्रयास करें:

boolean exitCondition= false; 

while(!exitCondition){ 
    if(in.ready()){ 
     if((line=in.readLine())!=null){ 
      // do whatever you like with the line 
     } 
    } 
} 
बेशक

आप exitCondition को नियंत्रित करने के लिए है।

एक अन्य विकल्प एनओओ पैकेज का उपयोग हो सकता है, जो एसिंक्रनाइज़ (अवरुद्ध नहीं) पढ़ने की अनुमति देता है लेकिन यह आपकी ज़रूरत पर निर्भर करता है।

BufferedReader inStream = new BufferedReader(new 
InputStreamReader(yourInputStream)); 
String line; 
while(inStream.ready() && (line = inStream.readLine()) != null) { 
    System.out.println(line); 
} 

inStream.ready() रिटर्न झूठी अगर अगले readLine() कॉल निष्पादन को अवरुद्ध कर देगा:

0

मैं समाधान का एक बहुत है, लेकिन केवल एक ही मैंने पाया जो निष्पादन अवरुद्ध नहीं कर रहा था की कोशिश की।

संबंधित मुद्दे