本程序使用到的所有类、方法以及内部类: 基于UDP协议编写一个GUI界面的简易聊天室 利用UDP协议进行信息的传输与接收,由于聊天室属于即时通讯,所以必须做到同时接收与发送,因此可以考虑利用多线程完成该目的。 使用到的组件: JPanel、JScrollPane、JLabel、JTextField、JTextArea、JButton 功能:实现对方IP以及端口号的输入,建立聊天,同时开启接收信息的监听线程 功能:实现聊天记录的清空 功能:实现数据的发送 功能:实现信息的同步发送与接收 说说博主的一些关于UDP的小想法,适用于刚接触UDP协议的小白: 看完的你可以哦o( ̄▽ ̄)ブ!基于UDP的GUI简易聊天室
1、效果图
2、项目开发
2.1、项目阐述
开发软件:IDEA2.2、项目思路
2.3、项目涉及知识点
2.4、UDP通信协议
原因:不同于TCP的三次握手协议,UDP是一个无状态的传输协议,因此传输数据非常快;由于没有TCP的确认机制、三次握手机制等多种机制,因此相对较为安全,但并不是绝对安全。2.5、GUI界面设计
public class UDPChatFace extends JPanel implements ActionListener { //创建变量 JPanel panel_1; JPanel panel_2; JPanel panel_3; JScrollPane panel_2_1;//滚动面板显示聊天记录 JPanel panel_2_2; JLabel label1;//监听 JLabel label2;//ip JLabel label3;//端口 JTextField textField_ip;//ip输入 JTextField textField_port;//端口号输入 JTextArea textArea_history;//聊天记录文本域 JTextArea textArea_message;//输入文字信息文本域 JButton button_concern; JButton button_send; JButton button_clear; //端口设置 //一般设置在8000以上,8000以下的端口号大部分被占用 private int localPort = 10001;//本地端口 private int otherPort = 10002;//对方端口 private String ip; String message;//输入框信息 private DatagramSocket socket; public UDPChatFace(){ init(); } public void init(){ //添加组件 panel_1 = new JPanel(); panel_2 = new JPanel(); panel_3 = new JPanel(); textArea_history = new JTextArea(40,68);//设置聊天记录框的大小 textArea_history.setEditable(false);//设置聊天记录框不可输入 textArea_message = new JTextArea(13,70); textArea_message.addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { //键盘监听事件,实现文本框输入后,按回车消息发送的功能 if (e.getKeyCode() == KeyEvent.VK_ENTER){ if (textArea_message.getText().equals("")){ JOptionPane.showMessageDialog(panel_1,"不可发送空白信息!"); //弹窗 return; }else { send(); //发送消息 } } } }); panel_2_1 = new JScrollPane(textArea_history); //将"聊天记录"输入框加入滚动面板中 panel_2_1.setBorder(BorderFactory.createTitledBorder("聊天记录"));//边框设置 panel_2_2 = new JPanel(); panel_2_2.setBorder(BorderFactory.createTitledBorder("请输入文字:"));//边框设置 String str = "正在监听****端口";//标签 label1 = new JLabel(str,JLabel.RIGHT);//靠右对齐 label2 = new JLabel("请输入对方IP:",JLabel.RIGHT); label3 = new JLabel("请输入对方端口号:",JLabel.RIGHT); textField_ip = new JTextField(5); textField_port = new JTextField(5); //绑定事件 button_send = new JButton("发送"); button_send.addActionListener(this); button_clear = new JButton("清空"); button_clear.addActionListener(this); button_concern = new JButton("确定"); button_concern.addActionListener(this); setLayout(new BorderLayout()); add(panel_1,BorderLayout.NORTH); add(panel_2,BorderLayout.CENTER); add(panel_3,BorderLayout.SOUTH); panel_1.setLayout(new FlowLayout()); panel_1.add(label1); panel_2.setLayout(new GridLayout(2,1)); panel_2.add(panel_2_1); panel_2.add(panel_2_2); panel_2_2.add(textArea_message); panel_3.setLayout(new FlowLayout()); panel_3.add(label2); panel_3.add(textField_ip); panel_3.add(label3); panel_3.add(textField_port); panel_3.add(button_concern); panel_3.add(button_send); panel_3.add(button_clear); ...... }
2.6、功能实现
2.6.1、“确定”按钮
//监听事件 @Override public void actionPerformed(ActionEvent e) { Object source = e.getSource(); if (button_send.equals(source)){//发送 ...... }else if (button_clear.equals(source)){//清空 ...... }else if (button_concern.equals(source)){//确定 if (textField_ip.getText().equals("") || textField_port.getText().equals("")){ JOptionPane.showMessageDialog(this,"未正确输入IP及端口号!");//弹窗 }else { label1.setText("正在监听" + textField_port.getText() + "端口"); ip = textField_ip.getText(); otherPort = Integer.parseInt(textField_port.getText()); if (otherPort == 10002){ localPort = 10001; } else { localPort = 10002; } new Receive().start();//启动监听线程 System.out.println(localPort); System.out.println(otherPort); button_concern.setEnabled(false);//设置按钮不可再点击 } } }
2.6.2、“清空”按钮
//监听事件 @Override public void actionPerformed(ActionEvent e) { Object source = e.getSource(); if (button_send.equals(source)){//发送 ...... }else if (button_clear.equals(source)){//清空 textArea_history.setText(""); }else if (button_concern.equals(source)){//确定 ...... } }
2.6.3、“发送”按钮
//监听事件 @Override public void actionPerformed(ActionEvent e) { Object source = e.getSource(); if (button_send.equals(source)){//发送 if (textArea_message.getText().equals("")){ JOptionPane.showMessageDialog(this,"不可发送空白信息!"); }else { send(); } }else if (button_clear.equals(source)){//清空 ...... }else if (button_concern.equals(source)){//确定 ...... }
采用UDP协议传输数据 public void init(){ ...... //节约空间,防止每次发送数据都会new一个对象 try { socket = new DatagramSocket(); } catch (SocketException e) { e.printStackTrace(); } } //用于文本框内信息的发送 private void sendMessage(byte[] data){ System.out.println("消息发送成功"); try { DatagramPacket packet = new DatagramPacket(data, data.length, InetAddress.getByName(ip), localPort); socket.send(packet); } catch (IOException e) { e.printStackTrace(); } } //发送消息 private void send(){ message = textArea_message.getText(); byte[] data = message.getBytes(); sendMessage(data); String str = "我对" + ip + ":" + otherPort + "说:" + message + 'n'; textArea_history.append(str);//添加进聊天记录框 textArea_message.setText("");//清空输入信息框 }
2.6.4、“接收”线程
//程序运行时需要同步接收与发送,因此应该使用多线程,new一个线程用于接收消息 private class Receive extends Thread{ @Override public void run() { System.out.println("监听正在运行"); DatagramPacket packet = null; try { socket = new DatagramSocket(otherPort); System.out.println("监听" + otherPort); byte[] data = new byte[1024*4]; packet = new DatagramPacket(data, data.length); while (true){ socket.receive(packet); byte[] bytes = packet.getData(); String message = new String(bytes,0,bytes.length); String str = ip + ":" + localPort + "对我说:" + message + 'n'; textArea_history.append(str); } } catch (IOException e) { e.printStackTrace(); } } }
2.7、启动程序
import javax.swing.*; /** * 启动程序 * @author TT * @create 2020-06-16-0:53 */ public class UDPChat extends JFrame { public static void main(String[] args) { JFrame frame = new JFrame("聊天室GUI版"); frame.add(new UDPChatFace());//注意次序,add方法在前面 frame.setVisible(true); frame.setSize(800,600); frame.setResizable(false); frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); } }
2.8、注意事项
3、小技巧
3.1、获取本机IP地址
3.2、IDEA同个程序运行两次设置方法
4、总结(UDP的理解)
转载麻烦告知并标明出处!
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算