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

📄 send.java

📁 java 语言模拟计算机网络中的停等协议
💻 JAVA
字号:
/**
 * 发送数据包一端
 * @author vincent chou
 * @version 2007.6.3 9:37
 */
package vincent;

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

public class Send 
{
	public static void main(String[] args)
	{
		SendFrame aSendFrame = new SendFrame();
		aSendFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		aSendFrame.setVisible(true);
	}
}

class SendFrame extends JFrame
{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	public SendFrame()
	{
		this.setTitle("发送数据");
		this.setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
		
		SendPanel aSendPanel = new SendPanel();
		this.add(aSendPanel);
	}
	
	public static final int DEFAULT_WIDTH = 300;
	public static final int DEFAULT_HEIGHT = 200;
}

class SendPanel extends JPanel
{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	public SendPanel()
	{
		this.setLayout(new BorderLayout());
		
		JPanel ipPanel = new JPanel();
		ipLabel = new JLabel("IP: ");
		portLabel = new JLabel("Port: ");
		ipText = new JTextField(10);
		portText = new JTextField(5);
		ipPanel.add(ipLabel);
		ipPanel.add(ipText);
		ipPanel.add(portLabel);
		ipPanel.add(portText);
		
		JPanel dataPanel = new JPanel();
		dataLabel = new JLabel("数据:");
		dataArea = new JTextArea(5,20);
		dataArea.setLineWrap(true);
		JScrollPane dataScroll = new JScrollPane(dataArea);
		dataPanel.add(dataLabel);
		dataPanel.add(dataScroll);
		
		JPanel buttonPanel = new JPanel();
		sendButton = new JButton("send");
		checkButton = new JButton("check");
		checkButton.setEnabled(false);
		sendButton.addActionListener(new
				ActionListener()
				{
					public void actionPerformed(ActionEvent event)
					{
						/*超时计时器*/
						outdateTimer = new Timer(10000,new
								ActionListener()
								{
									public void actionPerformed(ActionEvent event)
									{
										JOptionPane.showMessageDialog(null, "传输超时,重传数据!");
										outdateTimer.stop();
										if (sendMessage())
											;
									}
								});
						
						if (sendMessage())
						{
							sendButton.setEnabled(false);
							ipText.setEditable(false);
							portText.setEditable(false);
							dataArea.setEditable(false);
							checkButton.setEnabled(true);
							
						}
					}
				});
		checkButton.addActionListener(new
				ActionListener()
				{
					public void actionPerformed(ActionEvent event)
					{
						checkAnswer();
					}
				});
		buttonPanel.add(sendButton);
		buttonPanel.add(checkButton);
		
		this.add(ipPanel, BorderLayout.NORTH);
		this.add(dataPanel, BorderLayout.CENTER);
		this.add(buttonPanel,BorderLayout.SOUTH);
		
		SendRunnable sendRun = new SendRunnable();
		Thread sendThread = new Thread(sendRun);
		sendThread.start();
		
	}
	
	/**
	 * 发送数据
	 *
	 */
	public boolean sendMessage()
	{
		if ((ipText.getText().trim()).equals("") || (portText.getText().trim()).equals("") 
				|| (dataArea.getText().trim()).equals(""))
		{
			JOptionPane.showMessageDialog(null, "请输入IP地址和端口号以及内容");
			return false;
		}
		else
		{
			try
			{
				DatagramSocket ds = new DatagramSocket();
				String message = dataArea.getText().trim();
				DatagramPacket dp = new DatagramPacket(message.getBytes(),message.getBytes().length,
						InetAddress.getByName(ipText.getText()),Integer.parseInt(portText.getText()));
				ds.send(dp);
				ds.close();
				
				outdateTimer.start();
				
			}
			catch (IOException e)
			{
				e.printStackTrace();
			}
			return true;
		}
	}
	
	/**
	 * 确定数据接收情况
	 *
	 */
	public void checkAnswer()
	{
		try
		{
			BufferedReader br = new BufferedReader(new FileReader("f2.txt"));
			String line = br.readLine();
			if (line != null)
			{
				if (line.equals("NONE"))
				{
					JOptionPane.showMessageDialog(null, "数据丢失,重传数据!");
					outdateTimer.stop();
					if (sendMessage())
						;
				}
				else
				{
					outdateTimer.stop();
					ipText.setEditable(true);
					portText.setEditable(true);
					dataArea.setEditable(true);
					dataArea.setText("");
					sendButton.setEnabled(true);
					checkButton.setEnabled(false);
				}
			}
			else 
			{
				JOptionPane.showMessageDialog(null, "对方未响应,请稍后再试!");
			}
			br.close();
			deleteData();
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
	}
	
	public void deleteData()
	{
		try
		{
			PrintWriter out = new PrintWriter(new FileOutputStream("f2.txt"));
			out.close();
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
	}
	
	private JLabel ipLabel;
	private JLabel portLabel;
	private JLabel dataLabel;
	private JTextField ipText;
	private JTextField portText;
	private JTextArea dataArea;
	private JButton sendButton;
	private JButton checkButton;
	
	private Timer outdateTimer;
}

/**
 * 接收信息线程
 * @author vincent
 *
 */
class SendRunnable implements Runnable
{
	public void run()
	{
		receive();
	}
	
	/**
	 * 接收结果
	 * 
	 */
	public void receive()
	{
		try
		{
			while (true)
			{
				DatagramSocket ds = new DatagramSocket(5000);
				byte[] buf = new byte[1024];
				DatagramPacket dp = new DatagramPacket(buf,buf.length);
				ds.receive(dp);
				data = (new String(dp.getData())).trim();
				storeData();
				ds.close();
			}
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
	}
	
	/**
	 * 存储反馈信息到f2文件
	 *
	 */
	public void storeData()
	{
		try
		{
			PrintWriter out = new PrintWriter(new FileOutputStream("f2.txt"));
			out.println(data);
			out.close();
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
	}
	
	private String data;
}

⌨️ 快捷键说明

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