else{
System.out.println(\该数据分组不是接收方所期待的,该分组将被丢弃,接收方准备回送最后接受的数据分组对应的ACK!\
respond(lastdata); //若不是所期待的数据包则丢弃并且重发上一次的ACK
}
else{ }
System.out.println(\该数据分组正是接收方所期待的,接收方接受了它并准备回送对应的ACK!\ lastdata=data;
respond(lastdata); //首次接收数据包并且回送ACK
}
}
void respond(int ack){
if(sender.litime.limit<20){
ack=lastdata; sender.getack(ack);
} else{
System.out.println(\计时超时!!(未丢包但是时间超过2秒)发送方准备重发序
号为\的数据分组!\
sender.switches=1; //如果超时,设置超时状态并显示警告
}
} }
【Sender.java】 import java.util.Timer; import java.util.TimerTask;
public class Sender extends Thread{
public int windowsize=3; //发送方窗口长度设为3
public String[]data={\ //模拟七个数据包 public int sign[]={0,1,2,3,4,5,6}; //为7个数据包标号 public int localack=-1; public Timers litime=null; public int switches=0;
public int windowsign[];//当前窗口内待发的数据分组的序号
public int acksign = 0; //为0表示收到正确ACK,为1表示收到错误的ACK,必须重发! public Sender(){
windowsign = new int[windowsize]; //给窗口分配指定大小的空间 for(int i=0;i<3;i++) }
public void run(){ }
public void getack(int ack){
System.out.println(\发送方收到了ACK,序号为\并且开始加以确认!\ if(ack!=localack+1){
System.out.println(\经验证,这不是发送方正期待的ACK,立刻重发序号为\的数据分组!\ acksign=1; } else{
localack=ack; //表示正确确认了ACK acksign=0; }
System.out.println(\发送方开始发送分组数据!\ windowsign[i]=sign[i]; //窗口初始化时存放前3个序号
}
public void time(){ }
【Timers.java】 import java.util.TimerTask;
public class Timers extends TimerTask { public int switches; public int limit; public void run(){ if(limit<20)
limit++;
switches=0; //标志初始化为0 litime=new Timers(); Timer limit=new Timer(); limit.schedule(litime, 0,100); }
else { } }
public Timers(){ } }
switches=0;
limit=0; //启动计时器时全部初始化
switches=-1;
this.cancel(); //开关为-1表示超时,并且停止计时器