⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 slidingwindowprotocol.java

📁 这是一个虚拟网络模拟器
💻 JAVA
字号:
//: c11:SlidingWindow.java
// ģʾЭ
//package classes;

import java.io.*;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.event.*;
import javax.swing.border.*;

public class SlidingWindowProtocol extends JFrame
{
	private int windowWidth  = 800;		// ڴС
	private int windowHeight = 570;
	private Console console;			// ̨
	private SendPanel sendPanel;		// ʾ
	private ChannelPanel channelPanel;	// ͨŵ
	private SinkPanel sinkPanel;		// շ
	private JPanel mainPanel;			// 
	JPanel panel;
	private int maxSeq;					// ֡
	private int sendSize;				// ͷڴС
	private int sinkSize;				// շڴС
	private ComChannel channel;			// ͨŵ
	private Sender sender;				// ͽ
	private Sink   sink;				// ս

	public SlidingWindowProtocol()
	{	
		super("Эģʾ");panel=new JPanel();
		mainPanel= new JPanel();
		//mainPanel = (JPanel)this.getContentPane();	// 
		mainPanel.setLayout(null);				
		mainPanel.setBackground(Color.white);		// ñɫ
		
		// ͷӵ
		int sendX = 10;						// ͷʾλúʹС
		int sendY = 20;
		int sendWidth  = 250;
		int sendHeight = 200;
		sendPanel = new SendPanel(sendWidth,sendHeight);	// ͷʾ
		sendPanel.setBounds(sendX,sendY,sendWidth,sendHeight);
		mainPanel.add(sendPanel);
		
		// ͨŵӵ
		int chanX = sendWidth;				// ͨŵλúʹС
		int chanY = sendY;
		int chanWidth  = windowWidth - 2*sendWidth - 20;
		int chanHeight = sendHeight;
		channelPanel = new ChannelPanel(chanWidth,chanHeight);
  		channelPanel.setBounds(chanX,chanY,chanWidth,chanHeight);
  		mainPanel.add(channelPanel);
  		
  		// շӵ
  		int sinkX = sendWidth + chanWidth;	// շʾλúʹС
		int sinkY = sendY;
		int sinkWidth  = sendWidth;
		int sinkHeight = sendHeight;
		sinkPanel = new SinkPanel(sinkWidth,sinkHeight);
  		sinkPanel.setBounds(sinkX,sinkY,sinkWidth,sinkHeight);
  		mainPanel.add(sinkPanel);
  		
		// ̨ӵ
		int conWidth  = windowWidth - 18;	// λúʹС
		int conHeight = 100;
		int conX = 5;
		int conY = windowHeight - conHeight - 38;
		console   = new Console();			// ̨
		console.setBackground(Color.cyan);
		console.setBounds(conX,conY,conWidth,conHeight);
		panel.add(BorderLayout.CENTER,console);
		this.add(BorderLayout.CENTER,mainPanel);
		this.add(BorderLayout.SOUTH,panel);
		this.addWindowListener(				// رմ¼
			new WindowAdapter()
			{
				public void windowClosing(WindowEvent e)
				{
					System.exit(0);
				}	
			});
			
		maxSeq   = 7;							// ʼ֡Ϊ7
		sendSize = maxSeq;						// ĬϷͷڴС
		sinkSize = 1;							// ĬϽշڴС
		this.setBounds(100,50,windowWidth,windowHeight);
		this.setSize(windowWidth,windowHeight);
		this.setVisible(true);
	}

	// ʾʼ
	private void start()
	{
		if( channel==null)
		{
			channel = new ComChannel(channelPanel);			// ʼͨŵ
			if(channel.isUsable()==false)
			{
				System.out.println("ŵʧ");
			}
			else
			{
				channel.start();
				if(sender==null)
				{
					sender = new Sender(					// ʼ߳
						channel,maxSeq,sendSize,sendPanel);	
					sender.start();							// ʼ
				}
				if(sink==null)
				{
					sink = new Sink(						// ʼ߳	
						channel,maxSeq,sinkSize,sinkPanel);
					sink.start();							// ʼ
				}
			} 
		}
	}
	
	// ͣʾ
	private void pause()
	{
		if(sender!=null)
		{
			sender.pause();
		}
		if(sink!=null)
		{
			sink.pause();
		}
	}
	
	// ʾ
	private void continu()
	{
		if(sender!=null)
		{
			sender.continu();
		}
		if(sink!=null)
		{
			sink.continu();
		}
	}
	
	// ֹͣʾ
	private void stop()
	{
		if(sender!=null)
		{
			sender.close();
			sender = null;
		}
		if(sink!=null)
		{
			sink.close();
			sink = null;
		}
		if(channel!=null)
		{
			channel.close();
			channel = null;
		}
	}
	
	// 
	class Console extends JPanel
	{
		JButton start;			// ʼͣ
		JButton restart;		// ¿ʼ
		JButton stop;			// ֹͣ
		ButtonGroup  policy;
		JRadioButton goBackN;	// N֡
		JRadioButton select;	// ѡط
		
		Console()
		{
			start   = new JButton("start");
			restart = new JButton("restart");
			stop    = new JButton("stop");
			
			ActionListener buttonAction = 
				new ActionListener()
				{
					public void actionPerformed(ActionEvent e)
					{
							sendSize = maxSeq;		// ʹڴС
							sinkSize = 1;			// մڴС
							sendPanel.setWindowSize(sendSize);// ֪ͨͷ
							sinkPanel.setWindowSize(sinkSize);// ֪ͨշ
						if(e.getActionCommand().equals("start"))
						{
							start.setText("zantin");
							restart.setEnabled(false);
							stop.setEnabled(true);
						
							start();
						}
						
						if(e.getActionCommand().equals("zanting"))
						{
							start.setText("start");
							restart.setEnabled(false);
							stop.setEnabled(false);
						
							stop();
							start();
						}
						
						if(e.getActionCommand().equals("zanting"))
						{
							start.setText("start");
							restart.setEnabled(true);
							stop.setEnabled(true);
							pause();
						}
						
						if(e.getActionCommand().equals("restart"))
						{
							start.setText("start");
							restart.setEnabled(false);
							stop.setEnabled(true);
							continu();
						}
						
						if(e.getActionCommand().equals("stop"))
						{
							start.setText("start");
							restart.setEnabled(true);
							stop.setEnabled(false);
						
							stop();
						}	
					}
				};
		
			start.addActionListener(buttonAction);
			this.add(start);
			
			restart.addActionListener(buttonAction);
			restart.setEnabled(false);
			this.add(restart);
			
			stop.addActionListener(buttonAction);
			stop.setEnabled(false);
			this.add(stop);
			
			this.setBackground(Color.white);				
			this.setBorder(new TitledBorder("̨"));		
		}	
	}	
	
  	public static void main(String[] args)
  	{
  		new SlidingWindowProtocol();
  	}
}///:~

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -