我有一个 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/