简单()多窗口GUI,UDP本机通信
程序员文章站
2022-03-16 11:11:56
...
GUI界面:
- 开始画面,拥有开始以及退出按钮
- 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();
}
}
效果图
上一篇: 蓝牙无线通信技术
下一篇: STM32CubeMX系列|触摸屏
推荐阅读
-
linux C ----- udp, tcp, unix socket通信简单例子
-
python实现一个简单的udp通信的示例代码
-
Python用UDP编写一个简单的通信实例
-
多窗口下的批量操作脚本 - 利用win32gui和WindowSpy++简单实现目标窗口前置
-
Android应用使用UDP通信简单实现及注意事项
-
荐 Java基于UDP的GUI界面简易聊天室课程实验(获取本机IP、IDEA同个程序运行两次设置方法)
-
TCP/UDP简单通信案例
-
Java使用GUI完成UDP通信
-
一个简单的服务端与客户端UDP通信
-
Day.55————C++ socket编程实现简单的UDP、TCP通信(服务端+客户端)