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

📄 receive.java

📁 java 语言模拟计算机网络中的停等协议
💻 JAVA
字号:
/**
 * 模仿停等协议的接受数据方
 * @author vincent chou
 * @version 2007.6.2 22:10
 */
package vincent;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.net.*;
import java.io.*;
import java.util.*;

public class Receive 
{
	public static void main(String[] args)
	{
		ReceiveFrame aReceiveFrame = new ReceiveFrame();
		aReceiveFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		aReceiveFrame.setVisible(true);
	}

}

/**
 * 应答框架
 * @author vincent
 *
 */
class ReceiveFrame extends JFrame
{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	public ReceiveFrame()
	{
		this.setTitle("接收数据");
		this.setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
		
		ReceivePanel  aReceivePanel = new ReceivePanel();
		this.add(aReceivePanel);
		
	}
	
	public static final int DEFAULT_WIDTH = 300;
	public static final int DEFAULT_HEIGHT = 200;
}

/**
 * 接收框架
 * @author vincent
 *
 */
class ReceivePanel extends JPanel
{
	/**
	 * 
	 */
	private static final long serialVersionUID = -3971113349471090700L;
	public ReceivePanel()
	{
		this.setLayout(new BorderLayout());
		
		/*查询框架*/
		JPanel sPanel = new JPanel();
		searchLabel = new JLabel("查看是否有信息:");
		searchButton = new JButton("check");
		searchButton.addActionListener(new
				ActionListener()
				{
					public void actionPerformed(ActionEvent event)
					{
						if (checkMessage())
						{
							ackButton.setEnabled(true);
							nakButton.setEnabled(true);
							noneButton.setEnabled(true);
							resultArea.setText(data);
							deleteData();
						}
						else
						{
							resultArea.setText("没有新的数据包到来!");
						}
					
					}
				});
		sPanel.add(searchLabel);
		sPanel.add(searchButton);
		
		/*结果框架*/
		JPanel resultPanel = new JPanel();
		resultArea = new JTextArea(3,20);
		resultArea.setEditable(false);
		resultArea.setLineWrap(true);
		resultPanel.add(resultArea);
		
		/*回复框架*/
		JPanel rPanel = new JPanel();
		responseLabel = new JLabel("回复选择:");
		ackButton = new JButton("ACK");
		nakButton = new JButton("NAK");
		noneButton = new JButton("NONE");
		ackButton.setEnabled(false);
		nakButton.setEnabled(false);
		noneButton.setEnabled(false);
		
		responseAction rAction = new responseAction();
		ackButton.addActionListener(rAction);
		nakButton.addActionListener(rAction);
		noneButton.addActionListener(rAction);
		
		rPanel.add(responseLabel);
		rPanel.add(ackButton);
		rPanel.add(nakButton);
		rPanel.add(noneButton);
		
		this.add(sPanel,BorderLayout.NORTH);
		this.add(resultPanel,BorderLayout.CENTER);
		this.add(rPanel,BorderLayout.SOUTH);
		
		Runnable rRun = new receiveRunnable();
		Thread rThread = new Thread(rRun);
		rThread.start();
		
		
	}
	
	/**
	 * 应答机制
	 * @author vincent
	 *
	 */
	private class responseAction implements ActionListener
	{
		public void actionPerformed(ActionEvent event)
		{
			String rString = event.getActionCommand();
			if (rString.equals("ACK"))
				storeMessage();
			try
			{
				DatagramSocket ds = new DatagramSocket();
				DatagramPacket sendDp = new DatagramPacket(rString.getBytes(),
						rString.getBytes().length,address,5000);
				ds.send(sendDp);
				ds.close();
			}
			catch (IOException e)
			{
				e.printStackTrace();
			}
			
			resultArea.setText("");
			ackButton.setEnabled(false);
			nakButton.setEnabled(false);
			noneButton.setEnabled(false);
			
		}
	}
	
	/**
	 * 查看是否有新信息到来
	 * @return  true or false
	 */
	public boolean checkMessage()
	{
		try
		{
			BufferedReader in = new BufferedReader(new FileReader("f1.txt"));
			String line = null;
			if ((line = in.readLine()) != null)
			{
				StringTokenizer t = new StringTokenizer(line,"|");
				data = t.nextToken();
				address = InetAddress.getByName(t.nextToken());
				port = Integer.parseInt(t.nextToken());
				in.close();
				return true;
			}
			else
			{
				in.close();
				return false;
			}
		}
		catch (IOException e)
		{
			e.printStackTrace();
			return false;
		}
	}
	
	/**
	 * 存储接收信息到 f3文件
	 *
	 */
	public void storeMessage()
	{
		try
		{
			PrintWriter out = new PrintWriter(new FileOutputStream("f3.txt",true));
			out.println(data + "|"+ address + "|" + port + "|" + Calendar.getInstance());
			out.close();
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
	}
	
	public void deleteData()
	{
		try
		{
			PrintWriter out = new PrintWriter(new FileOutputStream("f1.txt"));
			out.close();
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
	}
	

	
	private JLabel searchLabel;
	private JLabel responseLabel;
	private JButton searchButton;
	private JButton ackButton;
	private JButton nakButton;
	private JButton noneButton;
	private JTextArea resultArea;
	
	private String data;
	private InetAddress address;
	private int port;
	
	
}

/**
 * 接收信息线程
 * @author vincent
 *
 */
class receiveRunnable implements Runnable
{
	public void run()
	{
		receive();
	}
	
	/**
	 * 接收结果
	 * 
	 */
	public void receive()
	{
		try
		{
			while (true)
			{
				DatagramSocket ds = new DatagramSocket(4678);
				byte[] buf = new byte[1024];
				DatagramPacket dp = new DatagramPacket(buf,buf.length);
			
				ds.receive(dp);
				data = (new String(dp.getData())).trim();
				address = dp.getAddress().toString();
				address = address.substring(1, address.length());
				port = dp.getPort();
				storeData();
				
				ds.close();
			}
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
	}
	
	/**
	 * 存储接收信息到f1文件
	 *
	 */
	public void storeData()
	{
		try
		{
			PrintWriter out = new PrintWriter(new FileOutputStream("f1.txt"));
			out.println(data + "|"+ address + "|" + port);
			out.close();
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
	}

	private String data;
	private String address;
	private int port;
}






⌨️ 快捷键说明

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