WinRT - TCP客户端?

Mat*_*zen 8 .net c# windows-runtime .net-4.5

我正在(.NET 4.5为Windows 8 Metro应用程序的新WinRT 框架中构建一个IRC客户端.

但是,我有一些问题.我已经发现我需要使用a 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);            
    }
}
Run Code Online (Sandbox Code Playgroud)

该代码后面的数据始终为空字符串.此外,UnconsumedBufferLength始终返回0.

怎么会?

Ste*_*ary 9

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

因此,如果要读取20个字节的字符串,请执行以下操作:

DataReader reader = new DataReader(tcpClient.InputStream);
await reader.LoadAsync(20);
string data = reader.ReadString(reader.UnconsumedBufferLength);
Run Code Online (Sandbox Code Playgroud)

如果要读取最多 20个字节的字符串,请执行以下操作:

DataReader reader = new DataReader(tcpClient.InputStream);
reader.InputStreamOptions = InputStreamOptions.Partial;
await reader.LoadAsync(20);
string data = reader.ReadString(reader.UnconsumedBufferLength);
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅此视频:http://channel9.msdn.com/Events/BUILD/BUILD2011/PLAT-580T

注意,DataReader它没有给你消息边界; 它只是一种等待和从流中读取二进制数据的更方便的方法.你仍然需要消息框架.