【发布时间】:2012-04-27 19:09:01
【问题描述】:
几乎所有的文件传输软件,如 [NetSupport, Radmin, PcAnyWhere..] 以及我在应用程序中使用的不同代码,当您发送大量小文件时,它会降低传输速度 就像 游戏文件夹 有很多文件。
例如在 LAN(以太网 CAT5 电缆)上,我发送一个文件,比如说视频,传输速率在 2MB 和 9MB 之间
但是当我发送一个包含大量文件的游戏文件夹时,传输速率约为 300kb-800kb
我猜这是因为发送文件的方式:
但是当您在网络上的共享文件夹上使用常规窗口[复制粘贴]时,发送文件夹的传输速度总是像发送单个文件一样快。
所以我尝试使用 [WCF service c# 4.0] 开发一个文件传输应用程序,该应用程序将使用 LAN 上可用的最大速度,我正在考虑这种方式:
Get all files from the folder.
if(FileSize<1 MB)
{
Create additional thread to send;
SendFile(FilePath);
}
else
{
Wait for the large file to be sent. // fileSize>1MB
}
void SendFile(string path) // a regular single file send.
{
SendFileInfo;
Open Socket and wait for server application to connect;
SendFileBytes;
Dispose;
}
但我对使用多个套接字进行文件传输感到困惑,因为这将使用更多端口和更多时间(侦听和接受延迟)。
那么这样做是个好主意吗?
需要一个关于是否可以做的解释,如何做,一个比 tcp 更好的协议,这意味着。
提前致谢。
【问题讨论】:
-
您是否考虑过将超出触发器大小的多个文件压缩到一个存档中,然后将其流式传输到另一端解压缩?
-
Andras 是对的,这将是迄今为止最快、最简单的方法。
-
@AndrasZoltan 我不认为 Windows 使用这种方式通过网络复制文件,最好将它们作为单个存档发送(仅用于小文件),但这需要更多处理和计算的时间以及服务器和客户端上更多的 CPU。
-
非常小的文件在网络上一个一个地移动时会产生巨大的开销:更多的文件意味着更多的传输,这反过来又意味着开销,最终意味着速度较慢。据我所知,最好的选择是将它们打包成一个字节数组,流式传输,然后在线路的另一端分解它。
-
@MurHafSoz 不,你是对的 - Windows 不使用这种技术 - 它使用的方法比你所处的级别更靠堆栈;事实上,我认为它甚至可能由文件系统本身处理,你将无法与之竞争。你必须作弊。
标签: c# sockets file-transfer