Tag:开源控件 , 源码下载 , 控件开发 , 控件美化 , 窗体换肤 , Skin , QQ表情 , Windows API , GDI+编程 , SQLite , Socket , 控件透明 , 下拉控件 , HTML 解析器 , 图片水印 , ScrollBar(滚动条) , Google Sitemap , 数据库 , SQL , WinForm , P/Invoke , Soket , 多文件传输 , UDP异步传输文件

 
您的位置: >> 首页 >> C# 视角 >> C# UDP(Socket)异步传输文件(6)-实现稳定的文件传输

C# UDP(Socket)异步传输文件(6)-实现稳定的文件传输

2009-08-06  来自:CS 程序员之窗  字体大小:【  
  • 摘要:上一篇文章C# UDP(Socket)异步传输文件(5)中,还遗留了一个传输文件最大的问题,就是传输过程中丢包,这样在文件传输过程中就会卡住了,这篇文章就来解决文件传输中的丢包问题,实现稳定的文件传输。

    上一篇文章C# UDPSocket)异步传输文件(5中,还遗留了一个传输文件最大的问题,就是传输过程中丢包,这样在文件传输过程中就会卡住了,这篇文章就来解决文件传输中的丢包问题,实现稳定的文件传输。

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

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

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

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

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

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

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

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


声明:

本文版权归作者和CS 程序员之窗所有,欢迎转载,转载必须保留以下版权信息,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

作者:Starts_2000

出处:CS 程序员之窗

你可以免费使用或修改提供的源代码,但请保留源代码中的版权信息,详情请查看:

CS程序员之窗开源协议