惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园_首页
J
Java Code Geeks
博客园 - 聂微东
量子位
C
Check Point Blog
T
The Blog of Author Tim Ferriss
T
Tailwind CSS Blog
G
Google Developers Blog
Google DeepMind News
Google DeepMind News
B
Blog
罗磊的独立博客
腾讯CDC
GbyAI
GbyAI
博客园 - 【当耐特】
A
About on SuperTechFans
M
MIT News - Artificial intelligence
U
Unit 42
D
Docker
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Y
Y Combinator Blog
大猫的无限游戏
大猫的无限游戏
小众软件
小众软件
S
SegmentFault 最新的问题
有赞技术团队
有赞技术团队

博客园 - KeithDan

Windows 8开发 WinRT 对ZIP文件解压缩及文件夹的ZIP压缩 wp应用发布,金宝贝点读 WP7游戏分裂细胞 WP7游戏方块夺宝 C#手工解析XML xeno tactic 2 完整版 Lua扫雷 惊人!天下奇闻“鹏” 今天很郁闷 HighLightCode1.2——开源项目 代码着色--关于循环与分组 代码着色--开源系列 利用非托管dll实现多平台加密 非托管dll的需要注意的地方 page_load执行两次 transfer object (2) transfer object (1) 中国象棋(网络版) 人生的阶梯
transfer object (3)
KeithDan · 2007-10-31 · via 博客园 - KeithDan

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

下面是一个小的demo演示
在这里呢,在这里我加入了数据缓冲区,大家可以相互学习.
Demo Source