在局域网上以最大速度传输文件

本文关键字:速度 传输 文件 局域网 | 更新日期: 2023-09-27 18:31:11

几乎所有的文件传输软件,如[NetSupport,Radmin,PcAnyWhere..]以及我在应用程序中使用的不同代码,当您发送大量小文件<1kb时>,它会减慢传输速度,例如包含大量文件的游戏文件夹

例如,在 LAN(以太网 CAT5 电缆)上,我发送一个文件,比如说一个视频,传输速率在 2MB 到 9MB
之间但是当我发送包含大量文件的游戏文件夹时,传输速率约为300KB-800KB

正如我猜的,这是因为发送文件的方式:

  • 发送文件信息 [file_path,file_Size]。
  • 发送文件字节 [循环到文件末尾]。
  • 结束传输 [确保完全接收]。

    但是,当您在网络上的共享文件夹上使用常规窗口[复制粘贴]时,发送文件夹的传输速率总是像发送单个文件一样快。
    所以我尝试使用 [WCF 服务 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更好的协议。
    提前谢谢。

  • 在局域网上以最大速度传输文件

    应该注意的是,你永远不会达到100%的LAN速度使用率 - 我希望你不希望这样 - 那里有太多的因素。

    为了回应您的评论,您无法达到操作系统用于传输文件的相同级别,因为您比Windows离裸机更远。 我相信 Windows 中的文件复制只比驱动程序本身高一两层(甚至可能在文件系统驱动程序中) - 在 WCF 服务,您离得更远!

    最简单的方法是将多个文件打包到存档中并以这种方式传输它们,然后在接收端将整个包解压缩到目标文件夹中。 当然,其中一些文件可能已经被压缩,因此不会受益 - 但总的来说,您应该看到很大的改进。 对于可以保留目录结构的坚如磐石的压缩,我会考虑使用 SharpZipLib

    智能使用压缩的系统(可能是中等级别,低 CPU 使用率,但在"可压缩"文件上运行良好)可能与操作系统复制相匹配或可能优于操作系统复制。 Windows 不使用此方法,因为它对容错毫无希望。 在操作系统中,在文件中途停止的传输仍将保留任何成功的文件。 如果传输本身被压缩和中断,则所有内容都将丢失,必须重新启动。

    除此之外,您还可以考虑以下几点:

    在尝试任何增强功能之前,先使用压缩使其正常工作。 在某些情况下(取决于大小/文件编号),您可能只需压缩整个文件夹,然后一次性传输即可。 但是,超过一定尺寸,这可能需要太长时间,因此您需要创建一系列较小的拉链。

    在接收压缩文件

    时将压缩文件写入磁盘上的临时位置,不要将整个文件缓冲在内存中。 将文件解压缩到目标文件夹中后删除该文件。

    考虑添加将某些文件类型标记为能够"裸"发送(即未压缩)的功能。 这样,您就可以从压缩过程中排除.zips,avis等文件。 也就是说,一个包含一百万个 1kb zip 文件的文件夹显然会受益于打包到一个存档中 - 所以也许让自己能够设置一个最小大小,超过这个大小,该文件仍将打包到压缩文件夹中(或者可能是文件夹本身的文件计数/磁盘大小比率 - 包括子文件夹)。

    除了这个建议之外,你还需要尝试一下才能获得最佳结果。

    也许

    ,一个简单的解决方案是将所有文件收集到一个大流中(就像压缩它们,但只是附加以使其快速)并发送这个流。这将提供更快的速度,但会消耗两个设备上的一些 CPU,并且知道如何分离流中的所有文件。

    但是,据我所知,使用更多的端口只会是一个缺点,因为会有更多的不同流发生碰撞,因此速度会下降。