使用.NET在慢速网络中移动不同大小的文件的最佳方法

时间:2010-03-29 16:12:17

标签: .net latency .net-remoting network-traffic network-efficiency

我正在构建一个.NET远程客户端/服务器,它将传输数千个不同大小的文件(从几个字节到几百MB),我想要一些关于实现最佳方法的反馈这个。在我看来,有几个选择:

  • 将整个文件序列化为我的远程处理对象,并立即传输,无论大小。这可能是最快的,但传输过程中的失败需要重新传输整个文件,无法恢复。
  • 如果文件大小大于小(如4KB),请将其分成4KB块并远程扫描,在服务器上重新组装。除了这种复杂性之外,由于持续的往返和确认,它的速度较慢,但​​任何一件都不会浪费太多时间。
  • 在我的应用程序中包含类似FTP或SFTP服务器的内容 - 客户端将通知服务器它正在开始使用远程处理,上传文件,然后使用远程处理来通知完成。我想在我的应用程序中包含所有内容,而不是需要单独的FTP服务,但如果需要,我可以选择此选项。
  • 使用某种陈述的TCP连接或WPF或其他一些传输方法来构建处理故障或能够进行某种检查点/恢复。
  • 我缺少的其他人?

最灵活/可靠的传输方法是什么?我不关心速度,但更关心可靠性 - 我希望文件移动,即使它很慢。由于客户端和服务器是多线程的,如果连接允许,我可以同时传输多个文件。

感谢您的反馈意见 - 我会慷慨解囊,就人们如何实现这一目标提出一些建议。

3 个答案:

答案 0 :(得分:4)

答案 1 :(得分:1)

虽然冷静确实回答了你从OSI第4层生活中提出的问题,但我觉得你更倾向于在你的问题中更多地关注应用程序层。 TCP绝对可以处理生活网络方面的延迟,传输窗口等所有内容。但是,如果用户提前结束下载会话,然后决定在他们中断的地方稍后再接收会话,则不直接确定会发生什么。

要从不同的角度回答您的问题,我肯定会建议将文件分块并为所有连接索引它们,无论速度如何。一旦整个文件下载,它们就可以在客户端上再次重新组装。这允许用户暂停下载会话并恢复。

就确定速度而言,可能有预先构建的方法来执行此操作,但您可以使用的一种方法是构建自己的速度测试: 向客户端发送1 MB(上传)并在收到后发送响应。 1100除以从客户端获得响应所花费的时间,是客户端从服务器下载所需的KB / s。反之亦然,从客户端测试上传。

就传输而言,我建议使用现有技术。 SFTP支持经过身份验证的加密数据传输。它基本上是FTP,但通过SSH。应该有一些API可用于与之交互。

另一方面,我从来没有做过你所谈论的任何事情,但希望我的想法至少可以给你几个选择。

答案 2 :(得分:0)

这就是TCP本身的用途,并在几十年或硬测试期间进行了调整。 Remoting用于小型RPC调用,而不是大型文件传输。您应该只使用TCP套接字来传输数据,让低层协议担心延迟,传输窗口,MTU等。