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.
怎么会?
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
它没有给你消息边界; 它只是一种等待和从流中读取二进制数据的更方便的方法.你仍然需要消息框架.