c# - WinRT - TCP 客户端?

标签 c# .net windows-runtime .net-4.5

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

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

怎么会?

最佳答案

在解释它们之前,您需要告诉 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 .

关于c# - WinRT - TCP 客户端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7596919/

相关文章:

.net - 在 Visual Studio 中创建 Apache Cordova 项目时出错

c# - 如何将全局异常处理程序添加到 Metro Style 应用程序?

c#获取接口(interface)方法注释

C# 数组,如何创建空数组?

c# - 异常阻止检测多个 XML 验证错误

c# - 如何向用户请求使用 Windows 应用商店应用中的位置的权限?

c# - 将属性绑定(bind)到方法

c# - MongoDb c# 驱动程序 2.0 BsonNull 用法

.net - 如果将 [userInstances=true] 添加到连接字符串,则会抛出异常

c# - list<T> 字段的平均计数