12月12日北京OSC源创会——开源技术的年终盛典»
udp 断点续传 发送文件夹 滑动窗口 延时重发
不知有没有现成好用的类,有的话还请告诉我一声,先谢谢了!
这个例子仅供学习参考。我原来觉得使用udp应该会比tcp快一些,但是既然要延时重发,也就是要保证连接可
靠性;既然要可靠,不如干脆用tcp得了,tcp在传输层实现了滑动窗口和流量及拥塞控制,直接用serverSock
et编程简单一点,实现多线程下载也方便
一、滑动窗口,延时重发:
我是这么实现的:其中用到了Thread.suspend()和resume()这些被Deprecated的方法,不过我用的时候倒
是没出什么问题。
发送方Sender大概如下:实例域包括两个Thread和一个timer。代码因为和其他功能有些耦合,所以没有贴出
来;这里只写个大概
用udp实现断点续传,采用滑动窗口,延时重发的思路
发表于4年前(2011112915:02)阅读(1251)|评论(0) 6 人收藏此文章,我要收藏
赞
1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
publicclassSenderextendsThreadGroup{
privateThreadt;//用来发送滑动窗口中的数据包
privateThreadr;//用来监听接收方的响应从而移动滑动窗口
privatejavax.swing.Timertimer;//滑动窗口中的数据发送完后还没有接收到回应,就启动这个定时器,计时结束后从新发送滑动窗口中的数据
publicSender(){
t=newT(this,"t");
r=newR(this,"r");
timer=newTimer(2000,newActionListener(){
publicvoidrun(){
t.resume();
}
}
}
publicvoidjoin(){
t.join();
r.join();
}
privateclassTextendsThread{
publicvoidrun(){
while(!eof){
while(要发送的数据包在滑动窗口范围中){//滑动窗口只不过是两个指针指向窗口的头和尾
datagramSocket.send(datagramPakcet);
已发送的长度+=数据包长度;
Thread.sleep(100);
}
timer.start();
suspend();
}
}
}
privateclassRextendsThread{
publicvoidrun(){
while(!eof){
datagramSocket.receive(datagramPacket);
接收到的packet中携带了接收方接收到了第几帧的信息,将移动窗口向前移动
timer.stop();
t.resume();