zoukankan      html  css  js  c++  java
  • 六、Socket之UDP异步传输文件-实现稳定的文件传输

    上一篇文章五、Socket之UDP异步传输文件-实现传输中取消传送中,还遗留了一个传输文件最大的问题,就是传输过程中丢包,这样在文件传输过程中就会卡住了,这篇文章就来解决文件传输中的丢包问题,实现稳定的文件传输。

             检测丢包是一个很麻烦的问题,解决的方法可能也有不少,我采用的是在接受文件端来检测,当开始接收文件,收到一个数据包后,如果等待超过了一定时间后都没有收到数据包,就给发送方发送一个新的请求,要求继续发送文件,直到文件全部接收完成。具体的做法就是:

    1、  ReceiveFileManager类中加入一个记录文件分块接收状态的列表Dictionary<int, bool>int表示文件分块的序号,bool表示是否已经接收,初始化为全部没有接受(false)。

    2、  ReceiveFileManager类中加入一个Timer,用来检测收到一个包后,等待的时间是否超过了设置的值,超过就给发送方发送数据包,请求继续发送文件,需要发送的文件块序号为从Dictionary<int, bool>中查询出来的没有接收的文件块序号。

    3、  如果Dictionary<int, bool>中的所有文件块已经收到(全部为true),文件就接收完成了。

    按照以上的做法,就可以保证文件可以全部接收到了。其实也可以从发送方来处理这个问题,就是发送方发送一个包后,如果等待了一定时间没有接收到接受方的回复,就重发这个包,也许有时间,下次就换这种方式看看,大家也可以自己试试。具体的实现还是挺麻烦的,大家从源码中看吧。

    在新的例子中,用了新写完的文件传输控件,外观漂亮了,控件的显示效率也提高了不少。

    到现在为止,基本上实现了一个稳定的异步UDP(Socket)发送多文件的功能了,在实现中是通过MD5做文件校验的,当文件很大的时候,计算MD5比较慢,所以就感觉发送的时候有点卡,其实很多时候是不需要的(QQ传文件也没有验证的),我们可以把这个功能取消掉,用一个GUID来标识每一个不同的文件就行了。

    下面来看看传输文件的截图:

  • 相关阅读:
    P2761 软件补丁问题
    CF1335F Robots on a Grid
    [bzoj2088]P3505 [POI2010]TEL-Teleportation
    CF1335E Three Blocks Palindrome
    P3831 [SHOI2012]回家的路
    P4568 [JLOI2011]飞行路线(分层图)
    P4774 [NOI2018]屠龙勇士
    P2480 [SDOI2010]古代猪文
    CF #632 (Div. 2) 对应题号CF1333
    BSGS 和扩展
  • 原文地址:https://www.cnblogs.com/xchit/p/3783424.html
Copyright © 2011-2022 走看看