📄 sr.java
字号:
package com.jjh.net;
// Java Applet Demonstration of Go-Back-N Protocol.
// Coded by Shamiul Azom. ASU ID: 993456298
// as project assigned by Prof. Martin Reisslein, Arizona StateUniversity
// Course No. EEE-459/591. Spring 2001
import java.applet.Applet;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.util.*;
public class SR extends Applet implements ActionListener, Runnable {
final int window_len_def = 5; // Default values of parameters
final int pack_width_def = 10;
final int pack_height_def = 30;
//水平方向偏移
final int h_offset_def = 150;
final int v_offset_def = 50;
//两行相距
final int v_clearance_def = 300;
final int total_packet_def = 20;
final int time_out_sec_def = 15;
final Color unack_color = Color.red; // Default colors of different packets
final Color ack_color = Color.yellow;
final Color sel_color = Color.green;
final Color roam_pack_color = Color.red;
final Color roam_ack_color = Color.yellow;
final Color dest_color = Color.blue;
int snd_base, nextseq, fps, selected = -1;
boolean timerFlag, timerSleep;
Button send, stop, fast, slow, kill, reset;
Thread gbnThread, timerThread;
Dimension offDimension; // flashing eliminator: double buffering
Image offImage;
Graphics offGraphics;
String statusMsg, strCurrentValues;
packet sender[];
// Declaring properties
int window_len, pack_width, pack_height, h_offset, v_offset, v_clearance,
total_packet, time_out_sec;
long currentTime = 0;
Set<Integer> snd_buffer = new TreeSet<Integer>();
Set<Integer> rcv_buffer = new TreeSet<Integer>();
int rcv_base = 0;
public void init() {
String strWinLen, strPackWd, strPackHt, strHrOff, strVtOff, strVtClr, strTotPack, strTimeout;
strWinLen = getParameter("window_length"); // Start collecting
// parameters
strPackWd = getParameter("packet_width");
strPackHt = getParameter("packet_height");
strHrOff = getParameter("horizontal_offset");
strVtOff = getParameter("vertical_offset");
strVtClr = getParameter("vertical_clearance");
strTotPack = getParameter("total_packets");
strTimeout = getParameter("timer_time_out");
// Get the values of the parameters into properties.
try {
if (strWinLen != null)
window_len = Integer.parseInt(strWinLen);
if (strPackWd != null)
pack_width = Integer.parseInt(strPackWd);
if (strPackHt != null)
pack_height = Integer.parseInt(strPackHt);
if (strHrOff != null)
h_offset = Integer.parseInt(strHrOff);
if (strVtOff != null)
v_offset = Integer.parseInt(strVtOff);
if (strVtClr != null)
v_clearance = Integer.parseInt(strVtClr);
if (strTotPack != null)
total_packet = Integer.parseInt(strTotPack);
if (strTimeout != null)
time_out_sec = Integer.parseInt(strTimeout);
} catch (Exception e) {
}
// If parameter is not found, use default values.
window_len = (window_len > 0) ? window_len : window_len_def;
pack_width = (pack_width > 0) ? pack_width : pack_width_def;
pack_height = (pack_height > 0) ? pack_height : pack_height_def;
h_offset = (h_offset > 0) ? h_offset : h_offset_def;
v_offset = (v_offset > 0) ? v_offset : v_offset_def;
v_clearance = (v_clearance > 0) ? v_clearance : v_clearance_def;
total_packet = (total_packet > 0) ? total_packet : total_packet_def;
time_out_sec = (time_out_sec > 0) ? time_out_sec : time_out_sec_def;
snd_base = 0; // Defining snd_base
nextseq = 0; // Defining Next sequence number.
fps = 10; // Defining default Frame per Second.
sender = new packet[total_packet];
statusMsg = "Ready to run. Press 'Send New' button to start.";
strCurrentValues = "Window Base = " + snd_base + ". Next Sequence No. = "
+ nextseq;
// Defining the buttons
send = new Button("Send New");
send.setActionCommand("rdt");
send.addActionListener(this);
stop = new Button("Stop Animation");
stop.setActionCommand("stopanim");
stop.addActionListener(this);
fast = new Button("Faster");
fast.setActionCommand("fast");
fast.addActionListener(this);
slow = new Button("Slower");
slow.setActionCommand("slow");
slow.addActionListener(this);
kill = new Button("Kill Packet");
kill.setActionCommand("kl");
kill.addActionListener(this);
kill.setEnabled(false);
reset = new Button("Reset");
reset.setActionCommand("rst");
reset.addActionListener(this);
// Adding the buttons
add(send);
add(stop);
add(fast);
add(slow);
add(kill);
add(reset);
}
public void start() {
if (gbnThread == null) // Creating main thread and start it
gbnThread = new Thread(this);
gbnThread.start();
}
public void run() {
Thread currenthread = Thread.currentThread();
while (currenthread == gbnThread)
// While the animation is running
if (onTheWay(sender)) // Checks if any of the packets are
// travelling
{
for (int i = 0; i < total_packet; i++)
if (sender[i] != null)
if (sender[i].on_way) // If packet is roaming
if (sender[i].packet_pos < (v_clearance - pack_height)) //在从上到下路上
sender[i].packet_pos += 5; // Move packet
else if (sender[i].packet_ack) // If it is moving //到达下端
// to destination
{
sender[i].reached_dest = true;
// if (check_upto_n(i)) // Send acknowledgement
// if all preceeding
//{ // packets are received.
sender[i].packet_pos = pack_height + 5;
sender[i].packet_ack = false;
statusMsg = "Packet " + i
+ " received. Acknowledge sent.";
//} else {
//sender[i].on_way = false;
if( i>=rcv_base && i <= rcv_base+window_len-1){
if( i == rcv_base ){
int[] seq = this.getRcvSequence(i);
if ( rcv_base+seq.length+window_len>=total_packet){
rcv_base = total_packet-window_len;
}
else
rcv_base+=seq.length;
//System.out.println(rcv_base);
this.removeRcvSequence(seq);
//System.out.println(seq[0]);
}
else{
rcv_buffer.add(new Integer(i));
}
}
else if( i>=rcv_base-window_len && i <= rcv_base-1 ){
//仍是要产生一个ACK
}
else{
//忽略
}
//statusMsg = "Packet " + i
// + " received. No acknowledge sent.";
/*if (i == selected) {
selected = -1;
kill.setEnabled(false);
}*/
//}
//确认到达上端
} else if (!sender[i].packet_ack) // acknowledgement
{
statusMsg = "Packet " + i
+ " acknowledge received.";
sender[i].on_way = false;
//for (int n = 0; n <= i; n++)
//sender[n].acknowledged = true;
//??上面一个循环可以用下面一句替代,可否
//sender[i].acknowledged = true;
if( i < snd_base || i>snd_base+window_len-1 ){
//忽略
}
else{
if( i == snd_base ){
//System.out.println(i);
int[] seq = this.getSndSequence(i);
if ( snd_base+window_len >= total_packet || (snd_base+seq.length+window_len>=total_packet) ){
snd_base = total_packet-window_len;
sender[i].acknowledged = true;
}
else
snd_base+=seq.length;
this.removeSndSequence(seq);
for (int n = 0; n < snd_base; n++)
sender[n].acknowledged = true;
}
else{
snd_buffer.add(new Integer(i));
System.out.println(i);
sender[i].acknowledged = true;
}
}
if (i == selected) {
//System.out.println("jinjunhang");
//??为何要把select设为-1
selected = -1;
kill.setEnabled(false);
}
timerThread = null; // resetting timer thread
if (nextseq < snd_base + window_len)
send.setEnabled(true);
if (snd_base != nextseq) {
System.out.println("jinjunhang");
statusMsg += " Timer restarted.";
timerThread = new Thread(this);
timerSleep = true;
timerThread.start();
} else
statusMsg += " Timer stopped.";
}
strCurrentValues = "Window Base = " + snd_base
+ ". Next Sequence No. = " + nextseq;
repaint();
try {
Thread.sleep(1000 / fps);
} catch (InterruptedException e) {
System.out.println("Help");
}
} else
gbnThread = null;
while (currenthread == timerThread)
if (timerSleep) {
timerSleep = false;
try {
//Thread.sleep(time_out_sec * 1000);
Thread.sleep( 1 * 100);
} catch (InterruptedException e) {
System.out.println("Timer interrupted.");
}
}
else {
for (int n = snd_base; n < snd_base + window_len; n++)
if (sender[n] != null)
if (!sender[n].acknowledged) {
long now = System.currentTimeMillis();
if( now - sender[n].snd_time >= time_out_sec * 1000){
sender[n].snd_time = now;
sender[n].on_way = true;
sender[n].packet_ack = true;
sender[n].packet_pos = pack_height + 5;
}
}
timerSleep = true;
if (gbnThread == null) {
gbnThread = new Thread(this);
gbnThread.start();
}
statusMsg = "Packets resent by timer. Timer restarted.";
}
}
public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand();
if (cmd == "rdt" && nextseq < snd_base + window_len) // Send button is pressed
{
//????pack_height + 5
sender[nextseq] = new packet(true, pack_height + 5);
statusMsg = "Packet " + nextseq + " sent.";
if (snd_base == nextseq) { // i.e. the window is empty and a new data is getting in
statusMsg += " Timer set for packet " + snd_base + ".";
if (timerThread == null)
timerThread = new Thread(this);
timerSleep = true;
timerThread.start();
}
repaint();
nextseq++;
if (nextseq == snd_base + window_len)
send.setEnabled(false);
start();
} else if (cmd == "fast") // Faster button pressed
{
fps += 2;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -