我正在使用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);
在服务器上,我有这个问题。
我应该使用什么字节[]大小来读取流?
由于
答案 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方法。