本学期计算机网络课程要求完成一个TCP和一个UDP的通信程序,我完成了功能的简单实现。我在上一篇博客已经讲了TCP的具体实现,接下来讲一讲UDP程序的实现。


目录

  • 效果展示
  • 一、项目结构
  • 二、完整代码
    • 1.UDPClient
    • 2.UDPServer
    • 3.UDPFrame
    • 4.UDPSend
    • 5.UDPReceive
    • 6.ReminderTextAdapter(参考别人的,非原创)
  • 总结

效果展示



以下是具体实现过程:

一、项目结构

下面说说每个类的具体作用:

UDPClient:UDP客户端的核心代码部分;
UDPServer:UDP服务器端的核心代码部分;
UDPFrame:UDP客户端和服务器端的界面搭建;
UDPSend:UDP客户端或服务器端的一端向另一端发送消息;
UDPReceive:UDP客户端或服务器端的一端接收另一端发送的消息;
ReminderTextAdapter:网上查阅的代码,非核心内容实现部分,主要用于灰色提示字hint功能的实现(swing中的实现方法不太熟悉);

注:在UDP通信中,没有TCP那样明确的ServerSocket,只是通过Datagram数据报的方式传递给另外的DatagramSocket,因此本项目中虽然有客户端与服务器端的区别,但本质上二者并无区别(即客户端与服务器端实现方式基本相同),因此客户端和服务器端需要的界面布局也相同,故我也把二者的界面抽取成了一个类,在此特地说明一下。

二、完整代码

1.UDPClient

代码如下:

package udpCommunication;import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;public class UDPClient implements ActionListener, Runnable {private DatagramSocket datagramSocket;private Thread thread = null;private UDPFrame clientFrame;public UDPClient() {JPanel panel = new JPanel();clientFrame = new UDPFrame("UDPClient");clientFrame.add(panel);clientFrame.placeComponents(panel);clientFrame.setVisible(true);clientFrame.getConnect().addActionListener(e -> {try {//host:"127.0.0.1"//String host = UDPClientFrame.getIpField().getText();//port:8887int dSocketPort = Integer.parseInt(clientFrame.getDSocketField().getText());datagramSocket = new DatagramSocket(dSocketPort);clientFrame.getTextArea().append("[连接] : 正在连接中……\n");clientFrame.getTextArea().append("\t连接成功\n");thread = new Thread(this);thread.setPriority(Thread.MIN_PRIORITY);thread.start();} catch (IOException ex) {ex.printStackTrace();}});clientFrame.getTransmit().addActionListener(this);clientFrame.getTextArea().append("……UDP客户端启动……\n");System.out.println("……UDP客户端启动……\n");}public static void main(String[] args) {new UDPClient();}//向服务器端发送数据@Overridepublic void actionPerformed(ActionEvent e) {//String send = UDPClientFrame.getSendField().getText();//port:8888//发送消息new UDPSend(datagramSocket, clientFrame, "客户端").sendMessages();}//使用线程处理客户端接收服务器端的数据@Overridepublic void run() {byte[] bytes = new byte[1024];DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);new UDPReceive(datagramSocket, datagramPacket, clientFrame, "服务器端").receiveMessages();}
}

2.UDPServer

代码如下:

package udpCommunication;import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.*;public class UDPServer implements ActionListener, Runnable {private DatagramSocket datagramSocket;private Thread thread = null;private UDPFrame serverFrame;public UDPServer() {serverFrame = new UDPFrame("UDPServer");JPanel panel = new JPanel();serverFrame.add(panel);serverFrame.placeComponents(panel);serverFrame.setVisible(true);//port:8888serverFrame.getConnect().addActionListener(e -> {try {int dSocketPort = Integer.parseInt(serverFrame.getDSocketField().getText());datagramSocket = new DatagramSocket(dSocketPort);serverFrame.getTextArea().append("[连接] : 正在连接中……\n");serverFrame.getTextArea().append("\t连接成功\n");thread = new Thread(this);thread.setPriority(Thread.MIN_PRIORITY);thread.start();} catch (IOException ex) {ex.printStackTrace();}});serverFrame.getTransmit().addActionListener(this);serverFrame.getTextArea().append("……UDP服务器启动……\n");System.out.println("……UDP服务器启动……\n");}public static void main(String[] args) {new UDPServer();}//向客户端发送数据@Overridepublic void actionPerformed(ActionEvent e) {new UDPSend(datagramSocket, serverFrame, "服务器端").sendMessages();}//使用线程处理服务器端接收客户端的数据@Overridepublic void run() {byte[] bytes = new byte[1024];DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);new UDPReceive(datagramSocket, datagramPacket, serverFrame, "客户端").receiveMessages();}
}

3.UDPFrame

代码如下:

package udpCommunication;import javax.swing.*;
import java.awt.*;/*** ip* DatagramSocket(hint:port)* DatagramPacket(hint:port)* send* showArea*/
public class UDPFrame extends JFrame {private static JTextField ipField;private static JTextField dSocketField;private static JTextField dPacketField;private static JTextField sendField;private static JTextArea textArea;private static JButton connect;private static JButton transmit;public UDPFrame(String title) {setSize(700, 480);setLocationRelativeTo(null);//居中显示setResizable(false);//设置不允许改变窗体大小setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setTitle(title);}public JTextField getIpField() {return ipField;}public JTextField getDSocketField() {return dSocketField;}public JTextField getDPacketField() {return dPacketField;}public JTextField getSendField() {return sendField;}public JTextArea getTextArea() {return textArea;}public JButton getConnect() {return connect;}public JButton getTransmit() {return transmit;}public static void placeComponents(JPanel panel) {panel.setLayout(null);Font font1 = new Font("宋体", Font.BOLD, 16);Font font2 = new Font("宋体", Font.PLAIN, 16);//创建JLabelJLabel ip = new JLabel("IP");ip.setFont(font1);//设置JLabel的字体ip.setBounds(80, 30, 135, 30);panel.add(ip);JLabel dSocketLabel = new JLabel("DatagramSocket");dSocketLabel.setFont(font1);dSocketLabel.setBounds(80, 65, 135, 30);panel.add(dSocketLabel);JLabel dPacketLabel = new JLabel("DatagramPacket");dPacketLabel.setFont(font1);dPacketLabel.setBounds(80, 100, 135, 30);panel.add(dPacketLabel);JLabel send = new JLabel("Send");send.setFont(font1);send.setBounds(80, 135, 135, 30);panel.add(send);JLabel text = new JLabel("Text");text.setFont(font1);text.setBounds(80, 170, 135, 30);panel.add(text);//创建文本域ipField = new JTextField(30);ipField.setFont(font2);ipField.addFocusListener(new ReminderTextAdapter(ipField, "默认:127.0.0.1"));ipField.setBounds(220, 30, 360, 30);panel.add(ipField);dSocketField = new JTextField(30);dSocketField.setFont(font2);dSocketField.addFocusListener(new ReminderTextAdapter(dSocketField, "port:"));dSocketField.setBounds(220, 65, 360, 30);panel.add(dSocketField);dPacketField = new JTextField(30);dPacketField.setFont(font2);dPacketField.addFocusListener(new ReminderTextAdapter(dPacketField, "port:"));dPacketField.setBounds(220, 100, 360, 30);panel.add(dPacketField);sendField = new JTextField(30);sendField.setFont(font2);sendField.addFocusListener(new ReminderTextAdapter(sendField, "请输入要发送的信息:"));sendField.setBounds(220, 135, 360, 30);panel.add(sendField);textArea = new JTextArea();textArea.setFont(font2);textArea.setBounds(220, 170, 360, 160);textArea.setEditable(false);textArea.setLineWrap(false);panel.add(textArea);//给textArea添加滚动条JScrollPane scrollPane = new JScrollPane();scrollPane.setBounds(220, 170, 360, 160);scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);panel.add(scrollPane);scrollPane.setViewportView(textArea);//添加两个按钮connect = new JButton("连接");connect.setFont(font1);connect.setBounds(140, 360, 115, 40);panel.add(connect);transmit = new JButton("发送");transmit.setFont(font1);transmit.setBounds(440, 360, 115, 40);panel.add(transmit);}
}

4.UDPSend

代码如下:

package udpCommunication;import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;public class UDPSend {private DatagramSocket datagramSocket;private UDPFrame udpFrame;private String sender;public UDPSend(DatagramSocket datagramSocket, UDPFrame udpFrame, String sender) {this.datagramSocket = datagramSocket;this.udpFrame = udpFrame;this.sender = sender;}public void sendMessages() {//String send = UDPServerFrame.getSendField().getText();//发送消息try {System.out.println("请输入" + sender + "要发送的消息:");String data = udpFrame.getSendField().getText();String ip = udpFrame.getIpField().getText();int dPacketPort = Integer.parseInt(udpFrame.getDPacketField().getText());byte[] bytes = data.getBytes();InetAddress inetAddress = InetAddress.getByName(ip);DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, inetAddress, dPacketPort);datagramSocket.send(datagramPacket);//udpFrame.getTextArea().append("\t" + sender + "发送消息成功\n");udpFrame.getTextArea().append("\t\t\t[" + sender + "] : " + data + "\n");String ipAddress = datagramPacket.getAddress().getHostAddress();System.out.println("ipAddress: " + ipAddress);System.out.println("ipField().getText(): " + ip);} catch (Exception ex) {ex.printStackTrace();udpFrame.getTextArea().append("\t" + sender + "尚未连接成功,消息发送失败\n");} finally {//System.out.println("\t"+sender+"发送消息成功\n");}}}

5.UDPReceive

代码如下:

package udpCommunication;import java.net.DatagramPacket;
import java.net.DatagramSocket;public class UDPReceive {private DatagramSocket datagramSocket;private DatagramPacket datagramPacket;private UDPFrame udpFrame;private String sender;public UDPReceive(DatagramSocket datagramSocket, DatagramPacket datagramPacket, UDPFrame udpFrame, String sender) {this.datagramSocket = datagramSocket;this.datagramPacket = datagramPacket;this.udpFrame = udpFrame;this.sender = sender;}public void receiveMessages() {try {while (true) {byte[] bytes = new byte[1024];datagramPacket = new DatagramPacket(bytes, bytes.length);datagramSocket.receive(datagramPacket);byte[] data = datagramPacket.getData();String string = new String(data, 0, datagramPacket.getLength());udpFrame.getTextArea().append("[" + sender + "] : " + string + "\n");Thread.sleep(1000);}} catch (Exception e) {e.printStackTrace();udpFrame.getTextArea().append(sender + "异常\n");udpFrame.getTextArea().append(sender + "与客户端连接中断\n");} finally {udpFrame.getTextArea().append(sender + "关闭\n");}}
}

6.ReminderTextAdapter(参考别人的,非原创)

代码如下:

package udpCommunication;import javax.swing.*;
import java.awt.*;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;public class ReminderTextAdapter extends FocusAdapter {//JTextField提示文字通用方法JTextField textField;String reminderString;//初始化public ReminderTextAdapter(JTextField textField, String reminderString) {this.textField = textField;this.reminderString = reminderString;}//焦点获得@Overridepublic void focusGained(FocusEvent e) {String tempString = textField.getText();//String tempString = this.getText();if (tempString.equals(reminderString)) {textField.setText("");textField.setForeground(Color.BLACK);}}//焦点失去@Overridepublic void focusLost(FocusEvent e) {String tempString = textField.getText();if (tempString.equals("")) {textField.setForeground(Color.GRAY);textField.setText(reminderString);}}}

总结

该项目简单的实现了UDP客户端和服务器端的通信,但是功能比较简单,页面也比较简洁,没有实现多个客户端互聊的功能等,还有待完善。


刚开始写博客,大家觉得不错的点个赞吧!如果大家有什么建议或者问题的,欢迎评论,我会尽量与大家探讨问题的。

Java实现简易UDP客户端、服务器端通信程序相关推荐

  1. Java多线程实现多客户端的通信

    title: Java多线程实现多客户端的通信 date: 2019-05-05 12:50:00 Java多线程实现多客户端的通信 昨天学了Java中网络支持Socket应用,写了一个基于TCP通信 ...

  2. OSI七层模型以及TCP/UDP客户端/服务端程序实例

    OSI七层模型以及TCP/UDP客户端/服务端程序实例 一.前言 二.OSI简介 2.1 OSI概念 2.2 划分原则 2.3 OSI七层模型 2.4 模型举例 三.Linux下TCP/UDP程序开发 ...

  3. 【Socket网络编程】6.两个既能收也能发的udp客户端进行通信的原理

    两个既能收也能发的udp客户端进行通信的原理 ​发送数据时可能会用到INADDR_BROADCAST代表255.255.255.255的广播地址,作用范围只能在当前局域网. 接收数据可能会用到INAD ...

  4. Java实现简易TCP客户端、服务器端通信程序

    本学期计算机网络课程要求完成一个TCP和一个UDP的通信程序,我完成了功能的简单实现,下面讲讲我的TCP程序的实现.(UDP的见另一篇博客) 目录 效果展示 一.项目结构 二.完整代码 1.TCPCl ...

  5. 网络基础:套接字编程,UDP和TCP通信程序

    文章目录 字节序 套接字编程 客户端与服务端 ★ netstat命令 ★ UDP通信程序 通信流程: 接口: 流程外的重要接口: 服务端代码 客户端代码 TCP通信程序 通信流程: 接口: 代码实例: ...

  6. Java Swing编写udp数据传输的聊天程序demo

    Java Swing编写udp数据传输的demo 事情是这个样子的,那天上软件工程课,老师和我们说,让我们一个星期内编写出一个udp进行数据传输的聊天程序,高级软件工程那本教科书上有响应的demo,但 ...

  7. 【Java】Socket多客户端Client-Server聊天程序

    文章目录 任务要求 实现代码 工具类 服务器端线程 客户端线程 服务器端程序 客户端程序 运行说明 任务要求 编写一个简单的Socket多客户端聊天程序: 客户端程序,从控制台输入字符串,发送到服务器 ...

  8. Java实现服务器和客户端简单通信

    Java中网络编程这一块有封装的类库,使用简单,了解原理可以教容易实现服务器和客户端的简单通信. 在编程之前,首先要需要对TCP/IP协议有一定的了解,需要知道Socket套接字的作用以及用法,这个可 ...

  9. Netty 客户端服务器端通信 demo

    服务端 package com.demo.rpc.netty;import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.*; ...

最新文章

  1. WebKit 框架解析
  2. Meshlab和CloudCompare截图时去除“旋转圈”
  3. java 字符整数_Java整数是否等于字符?
  4. 网工路由基础(8)路由重分布
  5. 设计模式之依赖倒转原则
  6. 你知道GNU C 对C语言的扩展吗?
  7. ASP面向对象编程探讨及比较
  8. Mysql学习笔记(一)数据类型
  9. Hadoop伪集群部署
  10. 阿里云刘伟光:核心系统转型之路
  11. acs510使用技巧_ACS510-ABB操作说明
  12. Android开发之Google地图开发
  13. 互联网大数据面试题集锦
  14. 禁止用鼠标拖动窗口的大小 - 回复 合肥的石头 的问题
  15. 我用 Python 写了一个AI 玩星际争霸2
  16. 大陆居民可以在香港汇丰银行开私人账户
  17. 当女生说没衣服穿时。。。。
  18. pandas之时序数据
  19. Visionpro从小白到大佬,第一章了解工具名称和用途
  20. 新版kettle学习

热门文章

  1. 深度学习入门---10分钟学会Python
  2. phpexcel.php官网,phpexcel 下载-PHPExcel(php excel样式) 1.8 官网版 - 河东下载站
  3. android使用adhoc共享上网
  4. 史上最便捷搭建 ZooKeeper 服务器的方法(建议收藏)
  5. Python实现贝叶斯优化器(Bayes_opt)优化BP神经网络回归模型(BP神经网络回归算法)项目实战
  6. target信息异常
  7. at91sam9260中断驱动
  8. 解除小米手机安装应用时候要输密码的限制
  9. 前端网址收集!Amazing! 神奇!
  10. 女孩子可以做什么副业,适合女孩做的副业推荐