Mail to Keith Dan
keith的天空
海阔凭鱼跃,天高任鸟飞
在UDP传输当中,我们对于文件的发送也是一个难点.
其中,难就难在发出去的包对方是否收到,这个就不得而知.上次我们说到可以对每个包进行编号,那么编号的意义在于传输的时候能准确定位于每个数据包.为了使对方准确收到包,那么我们在发送的以后同时要求对方回执一个确认包.
在我们的传输过程里,我们可以使用滑动窗口模式(当然,这个名字是我后来才听说的,呵呵),我们可以存储发送的包,记录其编号,假如我们发送了10个包,那么在我们的ArrayList存储体里可以记录如下
bag1:1
bag2:2
bag3:3
......
当我们每收到一个确认包,我们从存储体里移除一个记录的包.
那么如果我们发出去的包对方没有回执那怎么办呢?我们一直发送当前没收到的包吗?这些问题就是我们的重点.在这里,这种方案都不可取,为什么?
因为:如果我们一直对同一个包发送,而此时对方可能因为某种特殊原因而一直无法接收此位置的包,而我们发送端又无法偏移流位置,那么很可能造成程序的死锁.
我们既然已经记录了发送而未收到确认的包,那么在我们把包全部发送完毕以后,接下来要做的就是把这些发送未确认的包再次发送.直到该发送体内没有任何的包为止.当然,这里大家其实还可以发挥想象,如果是一个很大的文件呢?又或者网络极度恶劣呢?那么我们就应该创建发送缓冲区,这样文件被划分为多快区域,再次发送时仅是缓冲区内未确认的包而已.



下面是一个小的demo演示
在这里呢,在这里我加入了数据缓冲区,大家可以相互学习.
Demo Source
posted on 2007-10-31 15:36  KeithDan  阅读(1280)  评论(0编辑  收藏  举报