📄 sink.java
字号:
//: Sink.java
// ݻЭͨŵݽշ
//package classes;
import java.awt.*;
import java.util.*;
import javax.swing.*;
class Sink extends Thread
{
private boolean isRun; // ߳б־
private boolean isPause; // ߳ͣ־
private int sleepTime = 2000; // ߳ʱ
private int maxSeq; // ֡
private int windowSize; // ڴС
private ComChannel channel; // ͨŵ
private SinkPanel panel; // ʾ
private int frameExpected; // һӦõ֡
private int tooFar; // Ͻ1
private boolean isGoBackN;
private Packet[] buffer; // ֡
private boolean[] arrived; // Ӧŵ֡Ƿѵ
Sink(ComChannel channel,int maxSeq,int windowSize,SinkPanel panel)
{
this.channel = channel; //
this.maxSeq = maxSeq;
this.windowSize = windowSize;
this.panel = panel;
isRun = false; // ʼ
isPause = false;
frameExpected= 0;
tooFar = windowSize;
//nBuffer =0;
buffer = new Packet[windowSize];
arrived = new boolean[windowSize];
if(windowSize==1) // N֡
{
isGoBackN = true;
}
else // ѡش
{
isGoBackN = false;
}
}
//ʼ
public void start()
{
if(isRun==false)
{
isRun = true;
for(int i=0;i<arrived.length;i++)
{
arrived[i] = false;
}
panel.start(); // ֪ͨʾ
super.start();
}
}
//ֹͣ
public void close()
{
isRun = false;
panel.stop(); // ֪ͨʾ
synchronized(this)
{
if(this.getState()==Thread.State.WAITING)
{
//System.out.println("ReceiveAck.notify()");//!!!!!!!!!
this.notify(); // ֪ͨ
}
}
}
// ͣ
public void pause()
{
isPause = true;
}
//
public void continu()
{
isPause = false;
synchronized(this)
{
if(this.getState()==Thread.State.WAITING)
{
//System.out.println("ReceiveAck.notify()");//!!!!!!!!!
this.notify(); // ֪ͨ
}
}
}
//
private DataFrame receive()
{
return channel.popData();
}
private int inc(int k)
{
if(k<maxSeq)
{
k++;
}
else
{
k = 0;
}
return k;
}
// ȷ
private void sendAck(int seq, int kind)
{
DataFrame frame = new DataFrame();
frame.setKind(kind);
frame.setAck(seq);
//System.out.println("send ACk = "+seq);//!!!!!!!!!!
channel.pushAck(frame);
}
// bac֮,ͷtrue;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -