2011-09-29 19 views
8

मैं विंडोज 8 मेट्रो अनुप्रयोगों के लिए नए WinRT (.NET 4.5 में आईआरसी क्लाइंट का निर्माण कर रहा हूं।विनरेट - टीसीपी क्लाइंट?

हालांकि, मेरे पास कुछ समस्याएं हैं। मुझे पहले ही पता चला है कि मुझे टीसीपी डेटा पढ़ने के लिए StreamSocket का उपयोग करने की आवश्यकता है, लेकिन मैं कुछ गलत कर रहा हूं।

कारण मुझे विश्वास है क्योंकि मुझे कोई डेटा नहीं मिल रहा है।

नीचे आप मेरा कोड देखते हैं। मैं इसके बारे में वेब पर कोई भी कोड नमूने नहीं ढूंढ पा रहा हूं।

class IRCClient 
{ 
    private StreamSocket tcpClient; 
    public string Server = "holmes.freenode.net"; 
    public int Port = 6665; 

    public IRCClient() 
    { 
     tcpClient = new StreamSocket(); 
    } 

    public async void Connect() 
    { 
     await tcpClient.ConnectAsync(
         new Windows.Networking.HostName(Server), 
         Port.ToString(), 
         SocketProtectionLevel.PlainSocket); 

     DataReader reader = new DataReader(tcpClient.InputStream); 
     string data = reader.ReadString(reader.UnconsumedBufferLength); 

     MessageDialog dialog = new MessageDialog(data);    
    } 
} 

डेटा हमेशा उस कोड के बाद एक खाली स्ट्रिंग है। इसके अलावा, UnconsumedBufferLength हमेशा 0

कैसे आते हैं?

+0

यादृच्छिक विचार; क्या आपने एसिंक तरीकों का प्रयास किया है? शायद वे async का उपयोग करना चाहते हैं? –

+1

हां, कनेक्शन के समय तक अभी तक कुछ भी प्राप्त नहीं हुआ है। आपको इनपुटस्ट्रीम पर ReadAsync() को कॉल करना होगा। –

+0

क्षमा करें, सिर्फ एक जंगली गधा अनुमान है, लेकिन आईआरसी को मल्टीकास्ट यूडीपी कनेक्टिविटी की आवश्यकता नहीं है? – Haspemulator

उत्तर

9

आपको DataReader को स्ट्रीम करने से पहले स्ट्रीम से बाइट पढ़ने के लिए DataReader बताना होगा (ReadString बस पहले से पढ़े गए बाइट्स को व्याख्या करता है)।

तो, आप 20 बाइट की एक स्ट्रिंग को पढ़ने के लिए चाहते हैं, तो ऐसा करते हैं:

DataReader reader = new DataReader(tcpClient.InputStream); 
await reader.LoadAsync(20); 
string data = reader.ReadString(reader.UnconsumedBufferLength); 

आप 20 बाइट तक एक स्ट्रिंग पढ़ने के लिए चाहते हैं, तो ऐसा करते हैं:

DataReader reader = new DataReader(tcpClient.InputStream); 
reader.InputStreamOptions = InputStreamOptions.Partial; 
await reader.LoadAsync(20); 
string data = reader.ReadString(reader.UnconsumedBufferLength); 

अधिक जानकारी के लिए इस वीडियो को देखें: http://channel9.msdn.com/Events/BUILD/BUILD2011/PLAT-580T

ध्यान दें कि DataReader आपको संदेश सीमाएं नहीं देता है; यह स्ट्रीम से बाइनरी डेटा की प्रतीक्षा करने और पढ़ने का एक और अधिक सुविधाजनक तरीका है। आपको अभी भी message framing की आवश्यकता है।

+0

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

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