【发布时间】:2011-09-24 22:08:12
【问题描述】:
我正在尝试从网络流中读取一条已知长度的消息。
我有点期待NetworkStream.Read() 会等待返回,直到我给它的缓冲区数组已满。如果不是,那么ReadTimeout 属性的意义何在?
我用来测试我的理论的示例代码
public static void Main(string[] args)
{
TcpListener listener = new TcpListener(IPAddress.Any, 10001);
listener.Start();
Console.WriteLine("Waiting for connection...");
ThreadPool.QueueUserWorkItem(WriterThread);
using (TcpClient client = listener.AcceptTcpClient())
using (NetworkStream stream = client.GetStream())
{
Console.WriteLine("Connected. Waiting for data...");
client.ReceiveTimeout = (int)new TimeSpan(0, 1, 0).TotalMilliseconds;
stream.ReadTimeout = (int)new TimeSpan(0, 1, 0).TotalMilliseconds;
byte[] buffer = new byte[1024];
int bytesRead = stream.Read(buffer, 0, buffer.Length);
Console.WriteLine("Got {0} bytes.", bytesRead);
}
listener.Stop();
Console.WriteLine("Press any key to exit...");
Console.ReadKey(true);
}
private static void WriterThread(object state)
{
using (TcpClient client = new TcpClient())
{
client.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 10001));
using (NetworkStream stream = client.GetStream())
{
byte[] bytes = Encoding.UTF8.GetBytes("obviously less than 1024 bytes");
Console.WriteLine("Sending {0} bytes...", bytes.Length);
stream.Write(bytes, 0, bytes.Length);
Thread.Sleep(new TimeSpan(0, 2, 0));
}
}
}
结果是:
Waiting for connection...
Sending 30 bytes...
Connected. Waiting for data...
Got 30 bytes.
Press any key to exit...
是否有一种标准方法来进行同步读取,仅在读取指定数量的字节时才返回?我确信自己编写一个并不太复杂,但是TcpClient 和NetworkStream 上的超时属性的存在表明它应该已经以这种方式工作了。
【问题讨论】:
-
超过 1k 的代表仍然设法省略了一个最有用的标签。
head->desk -
我根本看不出这是一个与 C# 相关的问题。也不欣赏 asshattery。
-
那么您使用的是什么编程语言?它确实看起来像 C#。