C# NetworkStream.CanRead返回true,但缓冲区不返回值
我有一个do-while循环,它从C# NetworkStream.CanRead返回true,但缓冲区不返回值,c#,.net,tcp,ip,networkstream,C#,.net,Tcp,Ip,Networkstream,我有一个do-while循环,它从NetworkStream对象读取缓冲区 while条件是networkStream.CanRead,因此只要它可以读取,就应该继续从缓冲区读取。唯一的问题是,当我从缓冲区读取并转换为字符串时,缓冲区中什么都没有。i、 它是空的 为什么会这样 这是一个ASP.NET(VS2005)应用程序 @dtb代码信息: 我正在传递aNetworkStream对象NetworkStream // between 2 functions in a loop { Sen
NetworkStream
对象读取缓冲区
while条件是networkStream.CanRead
,因此只要它可以读取,就应该继续从缓冲区读取。唯一的问题是,当我从缓冲区读取并转换为字符串时,缓冲区中什么都没有。i、 它是空的
为什么会这样
这是一个ASP.NET(VS2005)应用程序
@dtb代码信息:
我正在传递aNetworkStream
对象NetworkStream
// between 2 functions in a loop
{
SendMessage(networkStream, message);
ReadMessage(networkStream);
}
有趣的是,如果它重新连接并再次连接,发送/读取工作正常。这实际上可能是Send(这里没有例外)或重用NetworkStream
对象的问题。在测试TCP服务器上,这在本地运行良好,但我在生产(Windows server 2003)时遇到了上述问题(即,无法从流中读取任何内容,直到我在10秒后实际超时(退出循环)
CanRead
是一个静态值,指示流是否能够被读取。属性会让您知道数据是否已准备好读取。请注意:在同一网络流上发送另一个数据请求后,它会在第一次发送时读取消息,这种情况会在第二次发送时发生go@soldieraman:如果darkassassin93的答案不能回答您的问题,请向我们显示您的代码。我感觉你在假设数据包边界和/或Read
方法返回的字节数可能是错误的。。。流是一个字节序列,它没有消息的概念。因此,您需要将字节流分解为消息的东西。在您的案例中,“消息”是如何定义的?你能举个例子吗?您正在与哪个服务器通信?您不能使用CanRead
来检测两条消息之间的边界,也不应为此使用DataAvailable
。+1。这里的“静态值”意味着该值由构造函数设置一次,并且在类被释放之前不会更改(在这种情况下,它将被设置为false
)。在其他问题中的注释中有指示,以便可以更改CanRead(我想也可以更改CanWrite),并且在流关闭时发生。不过,你基本上是对的。
ReadMessage(networkStream)
{
if (networkStream != null && networkStream.CanRead)
{
byte[] myReadBuffer = new byte[1024];
StringBuilder myCompleteMessage = new StringBuilder();
do
{
int numberOfBytesRead = networkStream.Read(myReadBuffer, 0, myReadBuffer.Length);
string messageRead = Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead);
myCompleteMessage.Append(messageRead);
} while (networkStream.CanRead);
}
}