通过 TCP 传输文件的最有效方式
Most efficient way to transmit file over TCP
我目前正在通过 Gzip 压缩文件然后转换为 base64 字符串来传输文件,它运行良好,但我希望尽可能提高效率,因为我确信这不是最好的方式由于 Base64,大小增加了 33%。
我正在考虑的另外两个选项是直接读写字节或序列化对象并发送它。
就 space 而言,最好的方法是什么? (我试图使文件的大小尽可能小)这些文件相对较小,大约 100kb。如果有任何见解,我将不胜感激。
如果您不想先发送长度,您可以使用此方法 - 在您从连接中获取 NetworkStream
对象后 - 用于读取 所有 来自流的数据。同样,在您的情况下不需要 base64,因此该解决方案可以读取一个字节数组,它将通过 NetworkStream
从发送方接收到该数组。
public static byte[] ReadFully(Stream input)
{
byte[] buffer = new byte[16*1024];
using (MemoryStream ms = new MemoryStream())
{
int read;
while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, read);
}
return ms.ToArray();
}
}
我目前正在通过 Gzip 压缩文件然后转换为 base64 字符串来传输文件,它运行良好,但我希望尽可能提高效率,因为我确信这不是最好的方式由于 Base64,大小增加了 33%。
我正在考虑的另外两个选项是直接读写字节或序列化对象并发送它。
就 space 而言,最好的方法是什么? (我试图使文件的大小尽可能小)这些文件相对较小,大约 100kb。如果有任何见解,我将不胜感激。
如果您不想先发送长度,您可以使用此方法 - 在您从连接中获取 NetworkStream
对象后 - 用于读取 所有 来自流的数据。同样,在您的情况下不需要 base64,因此该解决方案可以读取一个字节数组,它将通过 NetworkStream
从发送方接收到该数组。
public static byte[] ReadFully(Stream input)
{
byte[] buffer = new byte[16*1024];
using (MemoryStream ms = new MemoryStream())
{
int read;
while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, read);
}
return ms.ToArray();
}
}