接收传入流时使用的Byte []大小是多少

时间:2010-01-20 03:00:16

标签: c# sockets

我正在使用socket / TcpClient将文件发送到服务器,如下所示

        NetworkStream nws = tcpClient.GetStream();

        FileStream fs;

        fs = new FileStream(filename, FileMode.Open, FileAccess.Read);
        byte[] bytesToSend = new byte[fs.Length];
        int numBytesRead = fs.Read(bytesToSend, 0, bytesToSend.Length);
        nws.Write(bytesToSend, 0, numBytesRead);

在服务器上,我有这个问题。

我应该使用什么字节[]大小来读取流?

由于

3 个答案:

答案 0 :(得分:1)

您无法确定流的长度,您只能读到所有内容,直至结束。您可以先在流中发送长度,以便服务器知道预期的数量。但即使这样,通信错误也可能会截断发送的内容。

答案 1 :(得分:0)

这取决于协议。我会将大小设为4k或4096。您应该阅读Read返回0

答案 2 :(得分:0)

建议的缓冲区大小是this other question的主题。

但是,这确实意味着您需要从源流中读取并在循环中多次写入目标流,直到到达源流的末尾。代码可能如下所示(最初基于ZipPackage类的示例代码)

  public static long CopyTo(Stream source, Stream target)
  {
     const int bufSize = 8192;
     byte[] buf = new byte[bufSize];

     long totalBytes = 0;
     int bytesRead = 0;
     while ((bytesRead = source.Read(buf, 0, bufSize)) > 0)
     {
        target.Write(buf, 0, bytesRead);
        totalBytes += bytesRead;
     }
     return totalBytes;
  }

在.NET 4.0中,不再需要此类代码。只需使用新的Stream.CopyTo方法。