2010-06-22 4 views
8

यह एक मुझे पहेली करता है। मुझे यह जानने में कोई त्रुटि मिलती है कि मैं इसे कॉल नहीं कर रहा हूं?BufferedStream.Write क्यों फेंक देगा "यह स्ट्रीम तलाश संचालन का समर्थन नहीं करती है"?

मैं कोड है कि कुछ इस तरह दिखता है:

// send 42 
uint value = 42; 
byte[] msg = BitConverter.GetBytes(value); 
stream.Write(msg, 0, sizeof(uint)); 

और मैं इस अपवाद:

System.NotSupportedException was unhandled 
Message="This stream does not support seek operations." 
Source="System" 
StackTrace: 
    at System.Net.Sockets.NetworkStream.Seek(Int64 offset, SeekOrigin origin) 
    at System.IO.BufferedStream.FlushRead() 
    at System.IO.BufferedStream.Write(Byte[] array, Int32 offset, Int32 count) 
... 

स्ट्रीम प्रकार System.IO.BufferedStream की है। संभवतः क्या हो सकता है? अधिक जानकारी के साथ

संपादित करें:

इस मामले में sizeof(uint)==msg.length

कि यह था:
धारा के रूप में stream = new BufferedStream(new NetworkStream(socket), 1024)

संपादित घोषित किया जाता है! जबकि पर स्विच करते समय कोई भी NetworkStream पर पढ़ और लिख सकता है, तो पढ़ने और लिखने के लिए अलग होना आवश्यक है। यह स्पष्ट रूप से NetworkStream कन्स्ट्रक्टर को उसी सॉकेट पर दो बार कॉल करने के लिए कॉल कर सकता है।

अगर मैं कर सकता था तो मैं जस्टिन और हंस के दोनों उत्तरों को स्वीकार करता हूं, क्योंकि कोई मुझे सही समझने देता है कि क्या गलत था, और दूसरे ने मुझे समाधान के लिए प्रेरित किया। सबको धन्यवाद!

+0

यदि मदद करता है, तो BufferedStream नेटवर्कस्ट्रीम के शीर्ष पर है। – redtuna

+0

आपने buffered स्ट्रीम और किस आकार को घोषित किया है? यह किस प्रकार का प्रवाह है? और आकार (uint) का आकार नहीं होना चाहिए। लम्बाई? –

उत्तर

9

समस्या बुफर्डस्ट्रीम के आंतरिक कार्यों में निहित है (और तथ्य यह है कि आपने इसे लिखने के प्रयास से पहले बुफर्डस्ट्रीम को पढ़ने के लिए उपयोग किया होगा)।

जब आप एक BufferedStream को लिखने की कोशिश, अपने मानकों को मान्य करने के बाद, चीजों को इस क्रम में जाँच कर रहे हैं (सभी कोड परावर्तक के माध्यम से फ्रेमवर्क से खींचा):


लिखने की भीख माँग पर हम कर रहे हैं बफ़र?

if(this._writePos == 0) 

क्या हमें अंतर्निहित धारा में लिखने की अनुमति है?

if(!this._s.CanWrite) // throw error 

क्या रीड बफर खाली है?

if(this._readPos < this._readLen) 
{ 
    // FlushRead() will attempt to call Seek() 
    this.FlushRead(); 
} 

अगर वहाँ पढ़ने बफर में अपठित डेटा, एक फ्लश लिखने से पहले का प्रयास किया जाता है। FlushRead() कॉल(), कॉल करता है जो आपकी त्रुटि का कारण बन रहा है।

+0

ठीक है, इसलिए जब मैं अपठित डेटा नहीं करता हूं तो मैं लिख नहीं सकता ... जिसका मूल रूप से मतलब है कि मेरे पास एक थ्रेड पढ़ा नहीं जा सकता है और दूसरा उसी बुफर्डस्ट्रीम पर लिख सकता है। अब, जब मैं दूसरे कंप्यूटर से कनेक्ट करता हूं, तो मेरे पास नेटवर्कस्ट्रीम है, मैं उससे दो बुफर्डस्ट्रीम कैसे प्राप्त करूं? – redtuna

+0

@redtuna - यदि यह आपका लक्ष्य है, तो आपको दो BufferedStreams से मेल खाने के लिए दो नेटवर्कस्ट्रीम बनाना होगा। अन्यथा आप साझा नेटवर्कस्ट्रीम के साथ कई मुद्दों पर चलने जा रहे हैं। –

+0

धन्यवाद @ जस्टिन। – redtuna

4

आप उस बुफर्डस्ट्रीम से पहले पढ़ रहे होंगे। यह नेटवर्कस्ट्रीम से अपने बाइट प्राप्त कर रहा है। वे एक तरफ हैं, आप या तो केवल उनसे लिख सकते हैं या केवल उन्हें लिख सकते हैं, इस पर निर्भर करते हैं कि वे कैसे बनाए गए थे। अगर आपको अधिक सहायता चाहिए तो नेटवर्कस्ट्रीम बनाया गया कोड पोस्ट करें।

+0

आप कुछ पर हो सकते हैं: यह संभव है कि एक और धागा एक ही समय में पढ़ने की कोशिश कर रहा है, और यह समस्या होगी।दस्तावेज़ कहते हैं कि आप दोनों एक ही बुफर्डस्ट्रीम से पढ़ सकते हैं और लिख सकते हैं (और मेरे मामले में, दोनों .CanRead और .CanWrite सत्य हैं) लेकिन शायद एक ही समय में नहीं। – redtuna

+0

यदि आपके पास सही ढंग से बिंदु समझ रहा है, तो आपके पास दो नेटवर्कस्ट्रीम और दो बुफर्डस्ट्रीम हैं। एक से पढ़ें और दूसरे को लिखें। –

+0

@red: हां, बुफर्डस्ट्रीम पढ़ने और लिखने का समर्थन करता है। लेकिन जिस धारा से वह पढ़ रहा/लिख रहा है वह इसका समर्थन नहीं कर सकता है। नेटवर्कस्ट्रीम नहीं करता है। –

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