package GoBackN_BJTU;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Timer;
import java.util.TimerTask;
import java.io.IOException;
import java.net.*;
public class RdtProto {
private CommEndType commEndType;
UdtChannel udtChannel;
private Queue<byte[]> packetQueue = new LinkedList<byte[]>();
byte[] data = new byte[1440];
int base = 0, bases = 0;
LinkedList<byte[]> Link = new LinkedList<byte[]>();
LinkedList<byte[]> LinkList = new LinkedList<byte[]>();
int nextseqnum = 0;
int N = 4;
int ack = 0;
Timer timers = new Timer();
public RdtProto(CommEndType endType) {
commEndType = endType;
udtChannel = new UdtChannel(endType);
udtChannel.setBandwidth(1); // 设置带宽为1Mbps
udtChannel.setLossRatio(3); // 设置丢包率为3%
udtChannel.setBRT(0.5); // 设置误比特率为万分之0.5
udtChannel.setPropDelay(5, 15);
if (endType == CommEndType.COMM_SENDER) {
Thread t = new Thread(new Processor());
t.start();
}
}
public void openChannel(String peerIpAddr) {
udtChannel.setPeerAddress(peerIpAddr);
udtChannel.open();
}
public void closeChannel() {
udtChannel.close();
}
public void rdtSend(byte[] buffer, int len) {
while (nextseqnum >= base + N) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
byte[] a = new byte[len];
System.arraycopy(buffer,0,a,0,len);
Link.add(a);
data = Link.get(nextseqnum);
udtChannel.udtSend(data, len);
if (nextseqnum == base) {
if (timers != null)
timers.cancel();
timers = new Timer();
timers.schedule(new TTask(), 3000);
}
nextseqnum++;
};
class Processor implements Runnable {
@Override
public void run() {
while (true) {
byte[] buffer = new byte[1440];
int leng = udtChannel.udtRecv(buffer);
int ack = buffer[1] * 128 + buffer[0];
if (ack >= 0) {
System.out.println("Have send a packet, id = " + ack + ", size = " + leng);
base = ack + 1;
if (base == nextseqnum) {
timers.cancel();
} else {
if (timers != null)
timers.cancel();
timers = new Timer();
timers.schedule(new TTask(), 3000);
}
}
else
{
ack = -ack;
System.out.println("Have send a packet, id = " + ack + ", size = " + leng);
}
}
}
}
class TTask extends TimerTask {
public void run() {
for (int i = base; i < nextseqnum; i++) {
System.out.println("Resend a packet, id = " + i + ", size = " + Link.get(i).length);
udtChannel.udtSend(Link.get(i), Link.get(i).length);
}
}
}
public int rdtRecv(byte[] buffer) {
int len = udtChannel.udtRecv(buffer);
int id = buffer[1] * 128 + buffer[0];
if (id == ack) {
udtChannel.udtSend(buffer, len);
byte[] a = new byte[len];
System.arraycopy(buffer,0,a,0,len);
LinkList.add(a);
ack++;
} else{
udtChannel.udtSend(LinkList.get(ack - 1), LinkList.get(ack - 1).length);
}
return len;
}
}
计算机网络 GBN实验.zip
3星 · 超过75%的资源 需积分: 50 64 浏览量
2020-03-16
22:18:06
上传
评论 4
收藏 816KB ZIP 举报
weixin_42267288
- 粉丝: 79
- 资源: 60
最新资源
- 实验项目一:线性表(模板 ).docx
- 基于LM317A设计交流220V输入可调5V-12V直流输出稳压电源电路multisim10仿真源文件.zip
- Screenshot_2024-04-25-17-04-18-55_2332cb9b27b851b548ba47a91682926c.jpg
- -基于AVR单片机的LNG加液机控制器设计.pdf
- ThePowerOfNow-EckhartTolle.mobi
- BLOCK_TYPE_HEARTBEAT_D70A3465D4EE4E9_046141_dump_1st.dmp
- 项目方法测试调用接口工具
- studyupdate
- 基于西瓜数据集的决策树实现.zip
- 60套HTML网站源码-响应式-涵盖(简历&作品展示&商业&科技&培训&商城&课设等)-适配移动设备-解压即用.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈