8

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

但是,我有一些问题。我已经发现我需要使用 aStreamSocket来读取 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。

怎么会?

4

1 回答 1

9

您需要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这不会给您消息边界;它只是从流中等待和读取二进制数据的一种更方便的方式。您仍然需要消息框架

于 2011-09-29T13:48:14.017 回答