2009-09-20 37 views
11

बस मैं जावा में BufferedStreamReader क्या लागू करने की कोशिश कर रहा हूं। मेरे पास एक सॉकेट स्ट्रीम खुली है और बस लाइन द्वारा लाइन-उन्मुख फैशन लाइन में इसे पढ़ना चाहती है।सी # - StreamReader.ReadLine ठीक से काम नहीं करता है!

मेरे पास निम्न सर्वर-कोड है।

while (continueProcess) 
     { 
      try 
      { 
       StreamReader reader = new StreamReader(Socket.GetStream(), Encoding.UTF8); 
       string command = reader.ReadLine(); 
       if (command == null) 
        break; 

       OnClientExecute(command); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.ToString()); 
      } 
     } 

और निम्न क्लाइंट-कोड:

TcpClient tcpClient = new TcpClient(); 
     try 
     { 
      tcpClient.Connect("localhost", serverPort); 
      StreamWriter writer = new StreamWriter(tcpClient.GetStream(), Encoding.UTF8); 
      writer.AutoFlush = true; 
      writer.WriteLine("login>user,pass"); 
      writer.WriteLine("print>param1,param2,param3"); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.ToString()); 
     } 
     finally 
     { 
      tcpClient.Close(); 
     } 

सर्वर केवल बहुत पहली पंक्ति पढ़ता (login>user,pass) और फिर ReadLine रिटर्न अशक्त!

इस लाइन उन्मुख पाठक को प्राप्त करने का सबसे आसान तरीका क्या है क्योंकि यह जावा के BufferedStreamReader में है? :

+1

है। अन्यथा आपको अप्रत्याशित समस्याएं मिल सकती हैं। बस उनके चारों ओर एक प्रयोग ब्लॉक डालें (जैसा कि (स्ट्रीमवाइटर लेखक = ...) {}) में उपयोग किया जा रहा है, और आप ठीक होंगे – configurator

+0

यह नहीं कि यह प्रश्न के लिए प्रासंगिक था - बस एक सुझाव। – configurator

+0

महान;) धन्यवाद – Aleyna

उत्तर

12

एक ठेठ लाइन-रीडर की तरह कुछ है सार यह पुनरावर्तक ब्लॉक के साथ (चिंताओं की जुदाई):

static IEnumerable<string> ReadLines(Stream source, Encoding encoding) { 
    using(StreamReader reader = new StreamReader(source, encoding)) { 
     string line; 
     while((line = reader.ReadLine()) != null) { 
      yield return line; 
     } 
    } 
} 

(हम एक समारोह में इस चले गए और "कुछ करना", replaci हटा दिया है ध्यान दें के साथ "उपज वापसी" है, जो एक इटरेटर बनाता है (एक lazily दोहराया, गैर बफरिंग राज्य मशीन)

हम तो इस का उपभोग होता यह एनजी के रूप में बस के रूप में:

foreach(string line in ReadLines(Socket.GetStream(), Encoding.UTF8)) { 
    // do something with line 
} 

अब हमारे प्रसंस्करण कोड ऐसा नहीं करता के बारे में चिंता करने की आवश्यकता है लाइनों को पढ़ने के लिए - बस दिए गए लाइनों का एक अनुक्रम, उनके साथ कुछ करें।

ध्यान दें कि using (Dispose()) TcpClient पर भी लागू होता है; आपको IDisposable की जांच करने की आदत बनाना चाहिए; उदाहरण (अभी भी अपने त्रुटि लॉगिंग सहित) के लिए:

using(TcpClient tcpClient = new TcpClient()) { 
    try { 
     tcpClient.Connect("localhost", serverPort); 
     StreamWriter writer = new StreamWriter(tcpClient.GetStream(), Encoding.UTF8); 
     writer.AutoFlush = true; 
     writer.WriteLine("login>user,pass"); 
     writer.WriteLine("print>param1,param2,param3"); 
    } catch (Exception ex) { 
     Console.Error.WriteLine(ex.ToString()); 
    } 
} 
+0

जब मैं सॉकेट से पढ़ने के लिए StreamReader का उपयोग करता हूं, तो मैंने पाया कि क्लाइंट प्रोग्राम ठंडा हो रहा है, रीडलाइन() विधि पर अनंत समय ले रहा है, और अंततः पढ़ने में विफल रहा है। –

+0

@ मसूदराहमान जो आम तौर पर या तो इसका मतलब है: सर्वर एक पूर्ण लाइन नहीं भेज रहा है (यानी आप इसे किसी ऐसे चीज़ की प्रतीक्षा करने के लिए कह रहे हैं जिसके पास सर्वर को भेजने का कोई कारण नहीं है), या सर्वर एक फ्लश करना भूल गया है आउटपुट बफर आप * एक रीड टाइमआउट जोड़ सकते हैं, लेकिन आखिरकार यह सर्वर को डेटा भेज नहीं सकता है। आप निश्चित रूप से पढ़ना और खुद को बफर कर सकते हैं, लेकिन यह समस्या की प्रकृति को बदलता है - फिर यह तय करने के लिए आपका काम हो सकता है कि कुछ समय बाद पूरी लाइन नहीं भेजी गई है। –

5

आपके सर्वर कोड में जबकि प्रति कनेक्शन केवल एक पंक्ति पढ़ने के लिए सेटअप किया गया है। भेजे जाने वाले सभी लाइनों को पढ़ने की कोशिश के दौरान आपको एक और की आवश्यकता होगी। मुझे लगता है कि एक बार क्लाइंट पक्ष पर स्ट्रीम स्थापित हो जाने पर, यह सभी डेटा भेजने जा रहा है। फिर सर्वर की ओर, आपकी स्ट्रीम प्रभावी रूप से उस विशेष स्ट्रीम से केवल एक पंक्ति पढ़ रही है। ,

using(StreamReader reader = new StreamReader(Socket.GetStream(), Encoding.UTF8)) { 
    string line; 
    while((line = reader.ReadLine()) != null) { 
     // do something with line 
    } 
} 

(using ध्यान दें सुनिश्चित करने के लिए हम इसे Dispose() भले ही हम एक त्रुटि है, और पाश मिल)

यदि आप चाहते हैं आप:

+0

मेरी सर्वर और ग्राहक कोड में फेरबदल के रूप में सर्वर इस प्रकार के बाद: का उपयोग कर (StreamReader पाठक = नए StreamReader (Socket.GetStream(), Encoding.UTF8)) { जबकि (continueProcess) .... ग्राहक : ... थ्रेड। नींद (10000); लेखक। राइटलाइन ("प्रिंट> परीक्षण, एक, दो"); मैंने अपने क्लाइंट कोड और सर्वर पर थ्रेड स्लीप (10000) डाला अपवाद फेंकना शुरू कर दिया। ग्राहक सॉकेट तब तक खुला रहेगा जब तक क्लाइंट बाहर निकलता है और चूंकि क्लाइंट अपने जीवन चक्र में डेटा भेज देगा, ऐसा लगता है कि यह कोड त्रुटि फेंक देगा। क्या आपको ऐसा नहीं लगता? – Aleyna

+0

नया कोड या नया अपवाद क्या है यह देखे बिना, मुझे यकीन नहीं है कि समस्या क्या हो सकती है। – LJM

0

इस की कोशिश की और मिल गया

प्रकार या नाम स्थान का नाम 'स्ट्रीम' नहीं पाया जा सका (यदि आप एक का उपयोग कर के निर्देश या एक विधानसभा संदर्भ याद कर रहे हैं?) टाइप या नेमस्पेस नाम 'StreamReader' नहीं मिला (क्या आप एक प्रयोग निर्देश या असेंबली संदर्भ खो रहे हैं?) टाइप या नेमस्पेस नाम 'StreamReader' नहीं मिला (क्या आप एक निर्देश या असेंबली का उपयोग कर रहे हैं संदर्भ?) 'System.Net.Sockets.Socket' में 'GetStream'

के लिए परिभाषा नहीं है
+1

कृपया http://msdn.microsoft.com/en-us/library/system.io.stream.aspx देखें – Aleyna

0
public string READS() 
    { 
     byte[] buf = new byte[CLI.Available];//set buffer 
     CLI.Receive(buf);//read bytes from stream 
     string line = UTF8Encoding.UTF8.GetString(buf);//get string from bytes 
     return line;//return string from bytes 
    } 
    public void WRITES(string text) 
    { 
     byte[] buf = UTF8Encoding.UTF8.GetBytes(text);//get bytes of text 
     CLI.Send(buf);//send bytes 
    } 

सीएलआई एक सॉकेट है।कुछ रीज़ोन के लिए टीसीपी क्लाइंट क्लास मेरे पीसी पर और अधिक काम नहीं करता है, लेकिन सॉकेट क्लास ठीक काम करता है।

UTF-8 कृपया, यहाँ (StreamReader और StreamWriter) अपने वस्तुओं के निपटान फंसे StreamReader/लेखक एन्कोडिंग

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