2011-09-29 289 views
8

我在Windows 8 Metro应用程序的新WinRT (.NET 4.5)框架中构建IRC客户端。WinRT - TCP客户端?

但是,我有一些问题。我已经发现我需要使用StreamSocket来读取TCP数据,但我可能做错了什么。

我相信这是因为我没有收到任何数据。

下面你看到我的代码。我一直无法在网上找到任何关于此的代码示例。

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

随机想法;你有没有尝试过异步方法?也许他们想使用异步? –

+1

是的,在连接时没有收到任何信息。你将不得不在InputStream上调用ReadAsync()。 –

+0

对不起,只是一个疯狂的猜测,但不是IRC需要多播UDP连接? – Haspemulator

回答

9

您需要告诉DataReader在解释它们之前先从流中读取字节(ReadString只是解释已读取的字节)。

所以,如果你想读的20个字节的字符串,这样做:如果你想读一个字符串高达 20字节

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

,这样做:

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

另请注意,带有部分标志的LoadAsync只要有1个字节可用就可以返回,因此UnconsumedBufferLength可能小于字符串的总长度。 – chrisvarnz