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来标识每一个不同的文件就行了。

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

  • 相关阅读:
    JDK8中的 Lambda 表达式
    IDEA导入新项目jar包以及项目依赖tomcat设置
    idea导入项目,类为灰色,左下角有个红圈
    mysql服务忽然挂了,出现错误信息: Can’t connect to MySQL server on ‘localhost’ (10061)
    mysql、oracle、sql server连接信息
    mybatis中select * 中有字段,自己在起一个别名,然后实体类会使用哪个?
    pymongo的操作
    mongodb备份恢复
    mongodb建立索引
    mongodb聚合命令
  • 原文地址:https://www.cnblogs.com/xchit/p/3783424.html
Copyright © 2011-2022 走看看