欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

简单()多窗口GUI,UDP本机通信

程序员文章站 2022-03-16 11:11:56
...

GUI界面:

  1. 开始画面,拥有开始以及退出按钮
  • 1,开始:打开模式布局输入端口号,完毕后点击确定按钮关闭初始界面,打开通信界面
  • 2,输入端口号界面,用到文本框,拥有确定按钮
  • 3,点击第2步的确定打开通信界面
  • 4,通信界面:用文本域(可滚动),文本框,按钮(send)

StartWindow类

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.*;
import javax.swing.*;
//建立StartWindow类继承JFrame窗口
public class StartWindow extends JFrame{
	//建立一发送端口号码
	int sendPortNumber;
	int receivePortNumber;
	
	//无参构造函数
public StartWindow() {
	//窗体部分
	JFrame sw = new JFrame("start window");
	//
	sw.setBounds(400, 400, 300, 150);
	sw.setLayout(new BorderLayout());
	sw.setVisible(true);
	sw.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	//模式窗体部分
	JDialog dialog=new JDialog(this,"端口设置界面");
	dialog.setLayout(null);
	dialog.setBounds(400, 400, 300, 270);
	
	//button part
	JButton bt1=new JButton("start");
	JButton bt2=new JButton("exit");
	JButton bt1_1=new JButton("save");
	JButton bt1_2=new JButton("exit");

	//面板部分
	JPanel panel=new JPanel();
	
	//添加部分
	sw.add(panel,BorderLayout.SOUTH);
	panel.add(bt1);
	panel.add(bt2);
	dialog.add(bt1_1);
	dialog.add(bt1_2);
	
	//
	//标签部分
	JLabel label1=new JLabel("发送端端口号");
	JLabel label2=new JLabel("接收端端口号");
	
	//模式窗口组件布局
	bt1_1.setBounds(50, 200, 60, 30);
	bt1_2.setBounds(190, 200, 60, 30);
	
	
	bt1.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent e) {
			//关闭本窗口打开InputWindow窗口
			new InputWindow();
			sw.dispose();
			
		}});

	//按钮退出的动作事件
	bt2.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent e) {
			System.exit(0);
			}
	});

		}

}

InputWindow类

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;

import javax.*;
import javax.swing.*;
public class InputWindow extends JFrame{
	//输入端口号
	int sendPortNumber;
	//输出端口号
	int receivePortNumber;
	public InputWindow() {
		//窗口部分
		JFrame iw = new JFrame("input window");
		iw.setBounds(400, 400, 300, 270);
		iw.setLayout(null);
		iw.setVisible(true);
		iw.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		//按键,文本框部分
		JButton bt1_1=new JButton("save");
		JButton bt1_2=new JButton("exit");
		JTextField sendPort=new JTextField();
		JTextField receivePort=new JTextField();
		
		
		//
		//标签部分
		JLabel label1=new JLabel("发送端端口号");
		JLabel label2=new JLabel("接收端端口号");
		
		//模式窗口组件布局
		bt1_1.setBounds(50, 200, 60, 30);
		bt1_2.setBounds(190, 200, 60, 30);
		label1.setBounds(40, 40, 80, 30);
		label2.setBounds(40, 120, 80, 30);
		sendPort.setBounds(160, 40, 100, 25);
		receivePort.setBounds(160, 120, 100, 25);
		
		//添加部分
		iw.add(bt1_1);
		iw.add(bt1_2);
		iw.add(label1);
		iw.add(label2);
		iw.add(sendPort);
		iw.add(receivePort);
		
		//添加按键save的监听
		bt1_1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				//String转化int
				
			try { 
	//			 Runtime.getRuntime().exec("cmd   /c   start   www.baidu.com");
				//将发送端口文本框的值先变成int类型,再赋给sendPortNumber
					sendPortNumber= Integer.parseInt(sendPort.getText()); 
					receivePortNumber=Integer.parseInt(receivePort.getText());
					System.out.println(sendPortNumber);
					System.out.println(receivePortNumber);
					
					//将文本框清空
					sendPort.setText("");
					receivePort.setText("");
					
					//建立聊天室ChatRoom类的实例
					ChatRoom cr=new ChatRoom();
					
					//将发送,接收端口号传递给聊天室的实例cr
					cr.sendPortNumber=sendPortNumber;
					cr.receivePortNumber=receivePortNumber;
					
					//运行
					cr.run();
					
					//关闭此窗口
					iw.dispose();
				} catch (NumberFormatException ee) { 
				    ee.printStackTrace(); 
				} 
			}});
		
		bt1_2.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				//关闭当前
				iw.setVisible(false);
				
			}});

	}
}

ChatRoom类

import java.net.*;
import java.util.Scanner;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;


import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
public class ChatRoom implements Runnable{
	//静态,接收发送端口号
	static int sendPortNumber;
	static int receivePortNumber;
	//用于比较用
	static String t;
	//文本框接收到的数据
	static String content;

	public  void run() {
		for(int t=0;t<10000;t++) {
			for(int i=0;i<10000;i++) {
				
			}
		}
		
		
		
	System.out.println("3:"+sendPortNumber);
	System.out.println("3:"+receivePortNumber);
	
	//创建发发送任务,接收任务的实例
	SendTask2 st2=new SendTask2(sendPortNumber);
	ReceiveTask2 rt2=new ReceiveTask2(receivePortNumber);
	
	 
	 //创建窗体
JFrame f=new JFrame("Panel");
f.setLayout(new BorderLayout());
//创建文本域
JTextArea chatContent =new JTextArea(12,34);
//创建组件滚动面板,将文本域作为其显示组件
JScrollPane showPanel=new JScrollPane(chatContent);
//设置文本域不可编辑
chatContent.setEditable(false);
//设置JPanel面板
JPanel inputPanel=new JPanel();
//设置输入文本框
JTextField inputField=new JTextField(20);

//设置发送按钮
		JButton sendBt=new JButton("send");
		//创建标签
		Label label =new Label("聊天信息");
		//将标签添加到JPanel中
		inputPanel.add(label);
		inputPanel.add(inputField);
		inputPanel.add(sendBt);
		//将滚动面板和JPanel面板添加到f窗口中
		f.add(showPanel,BorderLayout.CENTER);
		f.add(inputPanel,BorderLayout.SOUTH);
		//设置窗体名
		f.setTitle("chatWindow");
		f.setBounds(400, 300, 500, 500);
		f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);;
		f.setVisible(true);
		
		//添加send的监听
		sendBt.addActionListener(new ActionListener() {
			private String content;
			private String t=" ";
			public void actionPerformed(ActionEvent e) {
				//获取文本框输入内容,将文本内容传递给外围
				this.content =inputField.getText();
				//传递值
				st2.setContent(this.content);
				//判断信息是否为空
				if(content!=null&&!content.equals("")){
					//如果不为空将输入文本框信息添加到文本域中
					chatContent.append("me:"+content+"\n");
				}else{
					//如果为空输出提醒到文本域中
					chatContent.append("System:chat did't null\n");
				}
				//将输入文本框内的内容清空
				inputField.setText("");
				//如果t和之前一样就把接收到的内容添加到文本域中
			     if(t.equals(rt2.getRData())) {
			    	 System.out.println("is is  same information");
			    	 
			     }else {
			    	 t=rt2.getRData();
			    	 //添加到文本域,接受任务实体rt2中的getRData值
						chatContent.append(rt2.getRData()+"\n");
					
			     }
				
			}
		});
		
		//添加输入文本框键盘事件:按下Esc健退出,按下Ent健发送
				inputField.addKeyListener(new KeyAdapter() {
						public void keyPressed(KeyEvent e) {
							if(e.getKeyCode()==KeyEvent.VK_ENTER) {
								//获取文本框的值
								String content =inputField.getText();
								//如果不是空就添加到文本域,否着提供提醒
								if(content!=null&&!content.equals("")){
									chatContent.append("me:"+content+"\n");
								}else{
							     		chatContent.append("System:chat did't null\n");
								}
								//清空文本框
								inputField.setText("");
							}
							if(e.getKeyCode()==KeyEvent.VK_ESCAPE) {
								System.out.println("System:key down window"); 
								System.exit(0);
							}
							
						}
				});
		
	
		//添加发送,接收任务类两个线程
		new Thread(st2,"send task").start();
		  new Thread(rt2,"receive task").start();
		
		
		
	
}
}

//接收任务类,承接Runnable接口
class SendTask2 implements Runnable{
	//定义IP地址
	String host="127.0.0.255";
	//定义发送端号
	private int sendPortNumber;
	//定义发送值
	private String content=" ";
	
	//获取文本框的内容传递到content
	public void setContent(String content) {
		this.content=content;
	}
	
	//有参构造函数,传递发送端口号
	public SendTask2(int sendPortNumber) {
		this.sendPortNumber=sendPortNumber;
	}
	
	//线程运行程序
	public void run() {
	try {
		//创建DatagramSocket(数据包)类ds,监听端口号为()
		DatagramSocket ds=new DatagramSocket();
		//发送端
		while(true) {
			//数据是content
			String data=content;
			//将数据转换成字节数组
			byte[] buf=data.getBytes();
			//创建一个要发送的数据包,数据包包括发送的数据,数据长度,接收端的IP地址和端口号
			DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName(host),this.sendPortNumber);
			//发送数据
			ds.send(dp);
			System.out.println("send "+data);
		}
		
	}catch(Exception e) {
		e.printStackTrace();
	}
	}

	
}
//接收任务类
class ReceiveTask2 implements Runnable{
	//
	private int receivePortNumber;
	//接收到的数据
	private String RData;
	//获得接收到的数据
	public String getRData() {
		return RData;
	}
	//接收端口号数值
	public ReceiveTask2(int receivePortNumber) {
		this.receivePortNumber=receivePortNumber;
		
	}
	//执行进程
	public void run() {
		try{
			//定义一个DatagramSocket对象,监听号为receivePortNumber
			DatagramSocket ds=new DatagramSocket(receivePortNumber);
			//创建一个长度为1024的字节数组,用于接收数据
			byte[] buf=new byte[1024];
			//定义一个DatagramPacket对象,用于接收数据
			DatagramPacket dp=new DatagramPacket(buf,buf.length);
			//
			while(true){
				//等待接收数据,如果没有数据就会阻塞
				ds.receive(dp);
				//获取接收到的数据,包括数据内容,长度,发送端的IP地址和端口号
				RData=dp.getAddress().getHostAddress()+": "+dp.getPort()+"  "+new String(dp.getData(),0,dp.getLength())+":";
				System.out.println("receive "+RData);
			}
		}catch(Exception e){
			e.printStackTrace();
			
		}
	}
	
}

执行程序测试类

import java.awt.*;
import javax.*;
import javax.swing.JFrame;
public class test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
new StartWindow();
		


	}

}

效果图

简单()多窗口GUI,UDP本机通信
StartWindow类显示效果
简单()多窗口GUI,UDP本机通信
InputWindow类,用于传递端口号

 

简单()多窗口GUI,UDP本机通信
聊天室类(ChatRoom)显示效果