【发布时间】:2012-03-19 03:26:08
【问题描述】:
我正在尝试从套接字读取数据,但是每当我尝试读取整个流时,我的程序都会挂起。没有错误或异常。
我可以手动读取 4 个字节并且它会工作,但是我不再知道服务器将发送的数据的确切大小,因此我希望读取整个流。我做错了什么?
调用 ReadToEnd() 时挂起。
Stream input = socket.GetStream();
byte[] request = new byte[5];
input.Write(request, 0, 5); //send request
StreamReader reader = new StreamReader(input);
if (input.CanRead == true)
{
string test = reader.ReadToEnd();
}
【问题讨论】:
-
“崩溃”是什么意思?您正在阅读一个流,它实际上可以无限长。如果你的程序是单线程的,那么很有可能你还没有完成 ReadToEnd()。
-
好吧,我应该说它挂起,它不会越过那条线。但是,如果我读到 5 个字节而不是 4 个字节,它也会以同样的方式挂起。
-
来自 streamreader 帮助页面:ReadToEnd 假设流知道它何时结束。对于服务器仅在您请求时才发送数据并且不关闭连接的交互式协议,ReadToEnd 可能会无限期阻塞,因为它没有到达终点,应该避免。您如何知道服务器何时完成向您发送数据?