前言

前几天没什么事儿,在学习UDP和TCP传输协议,顺手做了一个基于UDP协议的聊天小程序,同时复习了Java的GUI知识。

程序运行截图展示

1.运行程序,生成第一个窗口,输入要监听的端口号:1234(示例端口号)


2.再次运行程序,生成第二个聊天窗口,并且要输入端口号:4321(示例端口号)

3.然后,两个聊天窗口之间便可以对话了。

3.程序代码解读

首先,贴上全部代码,稍后会慢慢解释每一部分。

/*** */
package com.bert.udp;import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.SocketException;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;/*** @author Bert* 2019.03.09*/
public class GuiChat extends JFrame {private static final int DEFAULT_PORT = 8899;//把主窗口分为 NORTH.CENTER.SOUTH 三部分private JLabel stateLB;                 //显示监听状态private JTextArea centerTextArea;       //显示聊天记录private JPanel sourthPanel;             //最下面的面板private JTextArea inputTextArea;      //聊天输入框private JPanel bottomPanel;              //放置IP输入框,按钮等private JTextField ipTextField;         //IP输入框private JTextField remotePortTF;         //端口号输入框private JButton sendBT;                 //发送按钮private JButton clearBT;                  //清除按钮private DatagramSocket datagramSocket;    //发送数据用的载体/** 在构造方法中完成界面初始化,Socket连接初始化,和建立监听状态*/public  GuiChat() {setUPUI();initSocket();setListener();}/** 在 main方法中创建一个GuiChat类的对象,便是运行了程序;*/public static void main(String [] args) {new GuiChat();}/** 初始化聊天界面*/private void setUPUI() {   //聊天页面初始化setTitle("GUI聊天程序---出自JaffyMore");                  //窗口标题栏设置setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        //窗口关闭时触发动作:退出程序setSize(400, 400);                                       //窗口默认尺寸设置setResizable(false);                                  //窗口大小不允许改动setLocationRelativeTo(null);                             //窗口居中//设置窗口中的North部分stateLB = new JLabel("当前还未启动监听");stateLB.setHorizontalAlignment(JLabel.RIGHT);//窗口中的Center部分centerTextArea = new JTextArea();centerTextArea.setEditable(false);centerTextArea.setBackground(new Color(211, 211, 211));//窗口中的South部分sourthPanel = new JPanel(new BorderLayout());inputTextArea = new JTextArea(5,20);bottomPanel = new JPanel(new FlowLayout(FlowLayout.CENTER,5,5));ipTextField = new JTextField("127.0.0.1",8);remotePortTF = new JTextField(String.valueOf(DEFAULT_PORT),3);sendBT =new JButton("发送");clearBT = new JButton("清屏");bottomPanel.add(ipTextField);bottomPanel.add(remotePortTF);bottomPanel.add(sendBT);bottomPanel.add(clearBT);sourthPanel.add(new JScrollPane(inputTextArea),BorderLayout.CENTER);sourthPanel.add(bottomPanel,BorderLayout.SOUTH);add(stateLB,BorderLayout.NORTH);add(new JScrollPane(centerTextArea), BorderLayout.CENTER);add(sourthPanel, BorderLayout.SOUTH);setVisible(true);}private void setListener() {//为按钮添加监听事件sendBT.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {//获取发送的目标IP和端口号final String ipAddress = ipTextField.getText();final String remotePort = remotePortTF.getText();//判断IP地址和端口号是否为空if(ipAddress == null ||ipAddress.trim().equals("")||remotePort == null || remotePort.trim().equals("")){JOptionPane.showMessageDialog(GuiChat.this, "请输入IP地址和端口号");return;}if(datagramSocket == null || datagramSocket.isClosed()) {JOptionPane.showMessageDialog(GuiChat.this, "监听不成功");return;}//获取需要发送的内容String sendContent = inputTextArea.getText();byte[] buf = sendContent.getBytes();try {//将发送的内容显示到自己的聊天记录中centerTextArea.append("我对" + ipAddress + ":" +remotePort + "说 \n" + inputTextArea.getText() +"\n\n" );//添加内容后,使滚动条自动滚动到最低端centerTextArea.setCaretPosition(centerTextArea.getText().length());//发送数据DatagramPacket packet = new DatagramPacket(buf,buf.length,InetAddress.getByName(ipAddress),Integer.parseInt(remotePort));datagramSocket.send(packet);inputTextArea.setText("");}catch(IOException e1) {JOptionPane.showMessageDialog(GuiChat.this, "出错了,本次发送失败");e1.printStackTrace();}}});//为ClearBT 按钮添加事件监听器clearBT.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent arg0) {centerTextArea.setText("当前聊天内容为空,哈哈哈");}});}private void initSocket() {int port = DEFAULT_PORT;while(true) {try {if(datagramSocket != null && !datagramSocket.isClosed()) {datagramSocket.close();}try {//判断端口号范围port = Integer.parseInt(JOptionPane.showInputDialog(this,"请输入端口号","端口号",JOptionPane.QUESTION_MESSAGE));if(port <1 || port >65535) {throw new RuntimeException("端口号超出范围" + port);}}catch(Exception e) {JOptionPane.showMessageDialog(null, "你输入的端口号不正确" );continue;}//启动DataGramSocketdatagramSocket = new DatagramSocket(port);startListen();stateLB.setText("正在监听端口号:" + port);break;}catch(SocketException e) {JOptionPane.showMessageDialog(this, "端口号已经被占用,请重新输入" );stateLB.setText("当前还未启动监听");}}}private void startListen() { //创建线程进行消息接收new Thread() {private DatagramPacket datagramPacket;public void run() {byte [] buf = new byte[1024];//创建数据包datagramPacket = new DatagramPacket(buf, buf.length);while(!datagramSocket.isClosed()) {try {datagramSocket.receive(datagramPacket);centerTextArea.append(datagramPacket.getAddress().getHostAddress()+ ":" + ((InetSocketAddress) datagramPacket.getSocketAddress()).getPort() +"对我说: \n" + new String(datagramPacket.getData(),0,datagramPacket.getLength())+"\n\n" );}catch(IOException e) {e.printStackTrace();}}}}.start();}
}

4.最后

恭祝大家前程似锦。

项目展示--基于UDP传输协议+GUI的Java聊天小程序(图片加源代码)相关推荐

  1. java udp 流量控制_基于UDP传输协议的实现分析之流量和拥塞控制

    UDP的概念 UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种 ...

  2. 【项目展示】自己用C语言编写的象棋小程序

    本文目录 1.前言 2.程序规格 3.核心算法与象棋规则.术语 3.1 行棋规则与行棋判定函数设计 3.1.0 象棋棋盘 3.1.1 兵/卒 3.1.2 士 3.1.3 象 3.1.4 马 3.1.5 ...

  3. Java udp的使用和编写简单聊天小程序

    1. 入门 1.1. 发送端 import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetA ...

  4. Java的网络编程【TCP与UDP聊天小程序】

    Java的网络编程[TCP与UDP聊天小程序] 1. TCP协议 1.1 传输控制协议(Transmission Control Protocol),是一种**面向连接(全程保持连接)**的协议,类似 ...

  5. 几种常见的可靠UDP传输协议(包含C#实现)

    几种UDP网络库的整理Raknet,UDT,ENet,lidgren-network-gen3 http://blog.csdn.net/u014630768/article/details/3489 ...

  6. 【网络通信与信息安全】之深入解析TCP与UDP传输协议

    一.什么是 socket ? Socket 的英文原义是"孔"或"插座".在编程中,Socket 被称做套接字,是网络通信中的一种约定.Socket 编程的应用 ...

  7. 如何设计可靠性UDP传输协议?

    既然已经有TCP了,为什么还需要UDP可靠? 个人推荐视频: 如何设计可靠性UDP传输协议? TCP是强制的可靠性传输,其在IP协议的基础上,发送端对所有的数据进行定时重传,接受端对所有的数据进行排序 ...

  8. 毕设项目-基于人脸识别的高校课堂考勤微信小程序及系统

    基于人脸识别的高校课堂考勤微信小程序及系统 人脸识别.地图定位考勤微信小程序,调用百度云免费人脸识别API实现. 功能简介 教师学生信息管理,课堂考勤信息管理,人脸识别,地图打卡四大模块. 功能模块说 ...

  9. 微信小程序项目实战篇——基于WYY音乐真实接口开发的音乐小程序

    文章目录 一.项目简介 二.项目结构 三.开发工具 四.项目截图 五.项目地址 六.部分代码 七.项目运行 八.特别声明 一.项目简介 此小程序以网易云音乐为原型进行项目构建,使用网易云音乐真实API ...

最新文章

  1. springboot 分层_限量!阿里Spring Boot成长笔记终开源!理论实战满满
  2. Cookie获取用户的访问记录
  3. c++:MFC中sqlite3的使用(附实际案例)
  4. RAFT 寻找一种易于理解的一致性算法(扩展版)
  5. MAC OS 命令行使用详解
  6. C/C++如何连接MySQL服务器以及简单加密
  7. 用 Python 分析今年考研形势
  8. 计算机等级考试中的c语言程序
  9. golang语言示例:--->下载网站的json文件,同时对文件进行分析输出
  10. 当金蝶BOS开发网版主啦,纪念下!^_^
  11. python smtplib模块_python使用smtplib模块发送邮件
  12. 难道这个会是我的广角选择?
  13. 文本文档html乱码,文本文档乱码怎么办?电脑文本文档乱码解决方法
  14. springboot2.4+nettyWebServerApplicationContext@15f51c50 has been closed already问题解决
  15. Linux上安装JDK
  16. 软件测试基础知识整理(详细版)
  17. oracle数据库lpad,Oracle数据库之oracle中的decode的使用LPAD
  18. {转发}尚硅谷资料集锦
  19. 磁力搜索网站+下载神器放送2019-03-05
  20. 委托,了解发布者订阅者模型

热门文章

  1. 报名突破1000人!【UBDC全域大数据峰会·2016】就等你了!
  2. Minix3进程概述
  3. ERP行业内幕看了这五个问题全懂了
  4. flex弹弹弹性布局
  5. 公有云市场, SaaS难逃厄运
  6. CF1536F - Omkar and Akmar——博弈结论、组合数学
  7. 离散型随机变量 连续型随机变量汇总
  8. 模拟器安装应用:INSTALL_FALLED_INTERNAL_ERROR
  9. 诚迈科技子公司智达诚远精耕智能驾驶,为商用落地注入创新力量
  10. input禁用判断禁用_如何在索尼电视上禁用运动平滑