c# - 如何确定 NetworkStream 中何时没有更多数据可供读取?

标签 c# networkstream

我有一个 Web 应用程序,它使用 TCP 连接连接到服务器并读取二进制文档,然后将其写入其响应对象。换句话说,它使用自定义协议(protocol)从后端服务器传输文件,并通过 HTTP 将该文件返回给客户端。

服务器发送一个状态码和一个mime类型,我读取成功,然后写入文件内容并关闭socket。这似乎工作正常。

客户端(C# 网络应用程序)读取数据:

     private NetworkStream stream_;

     public void WriteDocument(HttpResponse response)
     {
        while (stream_.DataAvailable)
        {
           const int bufsize = 4 * 1024;
           byte[] buffer = new byte[bufsize];
           int nbytes = stream_.Read(buffer, 0, bufsize);
           if (nbytes > 0)
           {
              if (nbytes < bufsize)
                 Array.Resize<byte>(ref buffer, nbytes);
              response.BinaryWrite(buffer);
           }
        }
        response.End();
     }

这似乎总是在所有数据到达之前退出读取循环。我做错了什么?

最佳答案

我会直接将 OutputStream 与通用函数一起使用。通过Stream,您可以控制Flush

    public void WriteDocument(HttpResponse response) {
        StreamCopy(response.OutputStream, stream_);
        response.End();
    }

    public static void StreamCopy(Stream dest, Stream src) {
        byte[] buffer = new byte[4 * 1024];
        int n = 1;
        while (n > 0) {
            n = src.Read(buffer, 0, buffer.Length);
            dest.Write(buffer, 0, n);
        }
        dest.Flush();
    }

关于c# - 如何确定 NetworkStream 中何时没有更多数据可供读取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/111194/

相关文章:

c# - 如何使用oracledataadapter进行事务处理?

c# - 使用 MBUnit 的 Mirror 对私有(private) Func 委托(delegate)方法进行单元测试

c# - 在数据库中更新抛出 SqlException

c# - 可以将动态对象转换为 ExpandoObject (c#)

C# 异步 CTP - 如何在不抛出 TaskCanceledException 的情况下将异步任务标记为已取消?

c# - 复制流的最后 16 个字节以外的所有字节?流结束的早期检测?

c# - 如何对从 NetworkStream 派生的类进行单元测试?

c# - 加密的 NetworkStream 卡在 ReadLine() 上

c# - NetworkStream 连接自动关闭