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

1 篇文章 0 订阅

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();
		


	}

}

效果图

StartWindow类显示效果
InputWindow类,用于传递端口号

 

聊天室类(ChatRoom)显示效果
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值