断点传输

有网友提出这么一个场景(来自CSDN论坛):

假如,开始我向对方传c:\a.rm文件,中途断掉,下次我传c:\directory\a.rm,虽然这两个文件名都是a.rm,但内容是完全不同的,
那对方怎么知道是新的文件还是上次未传完的文件,或者说,是续传,还是重新传?

鉴别是不是同一个文件,基本上要用文件的hash来比较。

IM系统点到点传文件,跟做语音聊天类似,不是只有一路文件的数据。一般需要两路。一路信令,一路文件数据。要传文件的时候,发送方就把把文件用MD5算一下,把得到的hash值作为信令的一部分发给对方,对方保存。然后才开始传文件。

中途发生断点。后面再发起文件发送的时候,同样的,发送方计算MD5把hash值发给发送方,接收方比较一下已有的hash跟新收到的hash就可以确定是不是要续传还是新文件。接收方这个时候是不需要计算的。也就是计算文件的hash,只发生一次,在发送方。计算一个文件的hash,几百兆的文件也就几秒或者10多秒,这个相对于整个文件传输完成需要的时间是非常小的。

实际上,因为网速有限,大家可能一般不会传太大的文件,当传比较大的文件,上百兆的,大家基本不会期待它很快传完,如果几十分钟能传完就觉得可以了。这个时候传之前计算hash话掉的几秒-10几秒用户应该完全可以接受。


理论上TCP/IP丢包是会自动重传的,所以应该不会很慢的。至于你所说的整块传输是缓存模式吧,数据大点的情况最好使用流模式传输,一段段获取数据,就算传输中有什么问题,也不需要整块重传,流传输是有断点功能的


http://topic.csdn.net/u/20100107/15/fedb0198-f1a3-4a06-b5db-78c342ee6ddd.html?54394

http://topic.csdn.net/u/20100110/12/7e4aea70-011b-47d2-b7a4-30b259c6eda5.html

http://www.cnblogs.com/suyan010203/archive/2010/04/04/1704159.html


原文地址:https://www.cnblogs.com/TivonStone/p/2059229.html