C# NetworkStream Sleep()问题

C# NetworkStream Sleep()问题,c#,async-await,tcpclient,asyncsocket,networkstream,C#,Async Await,Tcpclient,Asyncsocket,Networkstream,我已经编写了一个TCP服务器,其中要读取的字节数以两个字节头作为前缀。从流中读取并将响应发送回客户端后,NetworkStream和TcpClient都将被释放。问题是,除非我取消对Thread.Sleep()行的注释,否则客户端似乎不会收到我的响应。代码如下: using (var tcpClient = await tcpServer.AcceptTcpClientAsync()) { tcpClient.NoDelay = true; using (var stream

我已经编写了一个TCP服务器,其中要读取的字节数以两个字节头作为前缀。从流中读取并将响应发送回客户端后,NetworkStream和TcpClient都将被释放。问题是,除非我取消对Thread.Sleep()行的注释,否则客户端似乎不会收到我的响应。代码如下:

using (var tcpClient = await tcpServer.AcceptTcpClientAsync())
{
    tcpClient.NoDelay = true;

    using (var stream = tcpClient.GetStream())
    {
        var twoBytesHeader = new TwoByteHeader();
        var headerBuffer = new byte[twoBytesHeader.HeaderLength];

        using (var binaryReader = new BinaryReader(stream, Encoding.ASCII, true))
        {
            headerBuffer = binaryReader.ReadBytes(twoBytesHeader.HeaderLength);

            int newOffset;
            var msgLength = twoBytesHeader.GetMessageLength(headerBuffer, 0, out newOffset);

            var buffer = binaryReader.ReadBytes(msgLength);

            string msgASCII = Encoding.ASCII.GetString(buffer);

            var bufferToSend = await ProcessMessage(msgASCII);

            using (var binaryWriter = new BinaryWriter(stream, Encoding.ASCII, true))
            {
                binaryWriter.Write(bufferToSend);
                binaryWriter.Flush();
            }

            //Thread.Sleep(1000);
        }
    }
}

当睡眠未注释时,客户端收到响应,然后指示客户端已断开连接。我无法找出这种行为的原因

您假设一次读取将读取您指定的字节数。相反,它将读取至少一个字节。您的代码需要能够处理这个问题
BinaryReader.ReadBytes
将允许您读取精确的字节数,并删除一些样板代码


此外,您可能不应该使用ASCII编码,这是最糟糕的编码。

如果您需要确保发送数据时没有错误,那么异步可能不是答案。当然,您要发送数据,知道它已发送,然后关闭?感谢您的回复。在本例中,我正在等待WriteAsync,因此它将等待所有字节发送完毕,然后才关闭连接。我肯定还有别的地方做错了。谢谢你指出使用stream阅读可能存在的问题,我会考虑的。至于编码,我没有选择,因为客户端发送ASCII编码的消息。无论如何,我仍然不明白,为什么将Sleep()放在stream.Flush()之后会让客户端接收响应。我已经读过Nagle的算法,但我假设Flush的行为类似于我设置了NoDelay属性,因为客户端坏了?张贴密码。;我描述的问题可能会导致服务器崩溃,并且无法发送请求。所以你可能无论如何都应该修复它,然后发布新代码。;网络流上的刷新不起任何作用。它不能改变任何东西。问题是客户端是一个我无权访问的外部应用程序。我为测试编写的简单客户端工作得很好。我会根据您的建议进行更改,看看是否有帮助,谢谢。我已经更新了初始代码并尝试了一下,但结果是一样的。睡懒觉才是关键,我不明白为什么可能客户破产了。禁用唠叨以尝试处理损坏的客户端。正如所解释的,Flush什么都不做。我从来没有找到冲洗插座的方法