我正在为 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/