还遗留了一个传输文件最大的问题,就是传输过程中丢包,这样在文件传输过程中就会卡住了,这篇文章就来解决文件传输中的丢包问题,实现稳定的文件传输。
检测丢包是一个很麻烦的问题,解决的方法可能也有不少,我采用的是在接收端来检测,当开始接收文件,收到一个数据包后,如果等待超过了一定时间后都没有收到数据包,就给发送方发送一个新的请求,要求继续发送文件,直到文件全部接收完成。具体的做法就是:
1、 在ReceiveFileManager类中加入一个记录文件分块接收状态的列表Dictionary<int, bool>,int表示文件分块的序号,bool表示是否已经接收,初始化为全部没有接受(false)。
2、 在ReceiveFileManager类中加入一个Timer,用来检测收到一个包后,等待的时间是否超过了设置的值,超过就给发送方发送数据包,请求继续发送文件,需要发送的文件块序号为从Dictionary<int, bool>中查询出来的没有接收的文件块序号。
3、 如果Dictionary<int, bool>中的所有文件块已经收到(全部为true),文件就接收完成了。
按照以上的做法,就可以保证文件可以全部接收到了。其实也可以从发送方来处理这个问题,就是发送方发送一个包后,如果等待了一定时间没有接收到接受方的回复,就重发这个包。具体的实现还是挺麻烦的,大家从源码中看吧。