Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NetworkStream.CanRead返回true,但缓冲区不返回值_C#_.net_Tcp_Ip_Networkstream - Fatal编程技术网

C# NetworkStream.CanRead返回true,但缓冲区不返回值

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

我有一个do-while循环,它从
NetworkStream
对象读取缓冲区 while条件是
networkStream.CanRead
,因此只要它可以读取,就应该继续从缓冲区读取。唯一的问题是,当我从缓冲区读取并转换为字符串时,缓冲区中什么都没有。i、 它是空的

为什么会这样

这是一个ASP.NET(VS2005)应用程序

@dtb代码信息:

我正在传递a
NetworkStream
对象
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);
    }
}