Java 实现 UDP 多发多收通信

在网络通信领域,UDP(用户数据报协议)以其无连接、高效率的特点,在实时通信场景中占据重要地位。本文将结合一段实现 UDP 多发多收的 Java 代码,详细解析其实现逻辑,帮助开发者深入理解 UDP 通信的底层逻辑与实现方式。

以下为实现 UDP 多发多收的 Java 代码,包含客户端和服务器端两部分:

客户端(Client)代码:

package com.practical.agreement.utp.utp_2;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;
/*
@description:UDP通信多发多收
@ClassName Client
@author chen
@create 2025-07-18 14:50
@Version 1.0
*/
public class Client
{public static void main(String[] args) throws Exception{System.out.println("----客户端启动----");// 1、创建客户端对象DatagramSocket socket = new DatagramSocket();Scanner sc = new Scanner(System.in);while (true){System.out.println("请说:");String msg = sc.nextLine();if("exit".equals(msg)){System.out.println("欢迎下次光临!退出成功!");socket.close(); // 释放资源break; // 跳出死循环}byte[] bytes = msg.getBytes();DatagramPacket packet = new DatagramPacket(bytes,bytes.length, InetAddress.getLocalHost(),  8888);// 3、开始正式发送这个数据包的数据出去了socket.send(packet);}}
}

服务器端(Server)代码:

package com.practical.agreement.utp.utp_2;import java.net.DatagramPacket;
import java.net.DatagramSocket;/*
@description:
@ClassName Server
@author chen
@create 2025-07-18 14:50
@Version 1.0
*/
public class Server
{public static void main(String[] args) throws Exception{System.out.println("----服务端启动----");// 1、创建一个服务端对象 注册端口DatagramSocket socket = new DatagramSocket(8888);// 2、创建一个数据包对象,用于接收数据的byte[] buffer = new byte[1024 * 64]; // 64KB.DatagramPacket packet = new DatagramPacket(buffer, buffer.length);while (true){// 3、开始正式使用数据包来接收客户端发来的数据socket.receive(packet);// 4、从字节数组中,把接收到的数据直接打印出来// 接收多少就倒出多少// 获取本次数据包接收了多少数据。int len = packet.getLength();String rs = new String(buffer, 0 , len);System.out.println(rs);System.out.println(packet.getAddress().getHostAddress());System.out.println(packet.getPort());System.out.println("--------------------------------------");}}
}

一、UDP 协议与多发多收功能概述

UDP 是一种无连接的传输层协议,它不保证数据传输的可靠性,也不提供流量控制和拥塞控制机制。但正因为省去了连接建立、确认重传等过程,UDP 的传输效率远高于 TCP,非常适合对实时性要求高、可容忍少量数据丢失的场景,如即时通讯、语音通话、视频流传输等。

上述代码实现了 UDP 协议下的 “多发多收” 功能 —— 客户端可以持续发送多条消息,服务器端则能实时接收并处理这些消息,直到客户端主动终止连接。这种通信模式充分体现了 UDP 的实时交互能力,也是网络编程中的典型应用场景。

二、核心代码解析

1. 客户端(Client)实现

客户端代码的核心功能是持续读取用户输入并向服务器发送数据报,直到用户输入 “exit” 为止。其关键实现步骤如下:

  • 创建 UDP 套接字:通过DatagramSocket类实例化客户端套接字,无需指定端口(由系统自动分配)。
  • 循环发送机制:使用while(true)构建无限循环,支持持续输入和发送消息。
  • 用户交互逻辑:通过Scanner读取控制台输入,若输入 “exit” 则关闭套接字并终止循环。
  • 数据包构建:将输入的字符串转换为字节数组,通过DatagramPacket封装数据,指定目标服务器的 IP 地址(本地主机)和端口(8888)。
  • 数据发送:调用socket.send(packet)发送数据包。

代码中InetAddress.getLocalHost()获取本地 IP 地址,确保客户端与服务器在同一主机上通信;DatagramPacket的构造参数明确了数据内容、长度、目标地址和端口,是 UDP 通信的核心数据载体。

2. 服务器端(Server)实现

服务器端代码的核心功能是监听指定端口,持续接收客户端发送的数据包并解析信息。其关键实现步骤如下:

  • 绑定端口:通过DatagramSocket(8888)创建服务器套接字并绑定 8888 端口,确保客户端能准确定向发送数据。
  • 缓冲区设置:定义 64KB 字节数组作为缓冲区(byte[] buffer = new byte[1024 * 64]),用于存储接收的数据。
  • 数据包接收:通过DatagramPacket实例接收数据,socket.receive(packet)为阻塞方法,会一直等待客户端数据。
  • 数据解析:通过packet.getLength()获取实际接收的数据长度,转换为字符串后输出;同时通过packet.getAddress()和packet.getPort()获取客户端的 IP 地址和端口,实现双向通信追溯。

服务器端同样采用无限循环,确保能持续接收多条消息,体现 “多收” 特性。

三、运行流程与交互逻辑

  1. 启动顺序:需先启动服务器端(绑定端口并进入监听状态),再启动客户端(避免连接失败)。
  1. 消息交互:客户端输入消息后,数据以 UDP 数据报形式发送到服务器端 8888 端口;服务器端实时接收并打印消息内容、客户端 IP 和端口。
  1. 终止机制:客户端输入 “exit” 后,关闭套接字并退出循环;服务器端需手动终止(可优化为支持优雅关闭)。

该流程清晰展现了 UDP “无连接” 特性:客户端无需与服务器建立持久连接,每次发送均为独立数据报,服务器端通过数据包中的源信息识别发送方。

四、技术特点与适用场景

优势

  • 实时性强:无连接开销,数据传输延迟低,适合实时聊天、游戏数据同步等场景。
  • 实现简单:无需处理连接建立、断开及重传机制,代码逻辑简洁。
  • 资源占用低:服务器端可同时接收多个客户端数据(需扩展多线程),适合高并发场景。

局限性

  • 不可靠性:数据可能丢失、重复或乱序,需在应用层实现校验机制(如添加序号)。
  • 缓冲区限制:固定缓冲区大小可能导致大数据包截断,需根据业务调整容量。

典型应用

  • 即时通讯工具(如局域网聊天软件)
  • 流媒体传输(音频、视频片段)
  • 物联网设备数据上报(传感器实时数据)

五、总结与扩展

本文通过 Java 代码实例,直观展示了 UDP 多发多收通信的实现方式。核心在于利用DatagramSocket和DatagramPacket类处理数据的发送与接收,通过循环结构实现 “多发多收” 功能。

实际开发中,可基于此代码进行扩展:

  • 增加异常处理机制(如try-catch块),提升程序健壮性。
  • 实现服务器端多线程处理,支持同时接收多个客户端消息。
  • 添加数据校验和重传逻辑,弥补 UDP 可靠性不足的缺陷。

掌握 UDP 通信原理与实现,对于理解网络协议分层模型及构建高性能网络应用具有重要意义。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/92247.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/92247.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java学习第六十二部分——Git

目录 一、关键概述 二、核心概念 三、常用命令 四、优势因素 五、应用方案 六、使用建议 一、关键概述 提问:Git 是什么? 回答:一句话,分布式版本控制系统(DVCS),用来跟踪文件&#…

CDN和DNS 在分布式系统中的作用

一、DNS:域名系统(Domain Name System) 1. 核心功能 DNS是互联网的“地址簿”,负责将人类易记的域名(如www.baidu.com)解析为计算机可识别的IP地址(如180.101.50.242)。没有DNS&…

uniapp用webview导入本地网页,ios端打开页面空白问题

目前还没解决,DCloud官方也说不行 IOS下webview加载本地网页时,无法加载资源 - DCloud问答

软考 系统架构设计师系列知识点之面向服务架构设计理论与实践(8)

接前一篇文章:软考 系统架构设计师系列知识点之面向服务架构设计理论与实践(7) 所属章节: 第15章. 面向服务架构设计理论与实践 第3节 SOA的参考架构 15.3 SOA的参考架构 IBM的Websphere业务集成参考架构(如图15-2所示,以下简称参考架构)是典型的以服务为中心的企业集…

基于 Docker 及 Kubernetes 部署 vLLM:开启机器学习模型服务的新篇章

在当今数字化浪潮中,机器学习模型的高效部署与管理成为众多开发者和企业关注的焦点。vLLM 作为一款性能卓越的大型语言模型推理引擎,其在 Docker 及 Kubernetes 上的部署方式如何呢?本文将深入探讨如何在 Docker 及 Kubernetes 集群中部署 vL…

工业互联网六大安全挑战的密码“解法”

目录 工业互联网密码技术应用Q&A Q1:设备身份认证与接入控制 Q2:通信数据加密与完整性保护 Q3:远程安全访问 Q4:平台与数据安全 Q5:软件与固件安全 Q6:日志审计与抗抵赖 首传信安-解决方案 总…

基于springboot的在线问卷调查系统的设计与实现(源码+论文)

一、开发环境 1 Java语言 Java语言是当今为止依然在编程语言行业具有生命力的常青树之一。Java语言最原始的诞生,不仅仅是创造者感觉C语言在编程上面很麻烦,如果只是专注于业务逻辑的处理,会导致忽略了各种指针以及垃圾回收这些操作&#x…

民法学学习笔记(个人向) Part.1

民法学学习笔记(个人向) Part.1有关民法条文背后的事理、人心、经济社会基础;民法的结构民法学习的特色就是先学最难的民法总论,再学较难的物权法、合同法等,最后再学习最简单的婚姻、继承、侵权部分。这是一个由难到易的过程,尤为…

ElasticSearch Doc Values和Fielddata详解

一、Doc Values介绍倒排索引在搜索包含指定 term 的文档时效率极高,但在执行相反操作,比如查询一个文档中包含哪些 term,以及进行排序、聚合等与指定字段相关的操作时,表现就很差了,这时候就需要用到 Doc Values。倒排…

【C语言】解决VScode中文乱码问题

文章目录【C语言】解决VScode中文乱码问题弹出无法写入用户设置的处理方法弹出无法在只读编辑器编辑的问题处理方法【C语言】解决VScode中文乱码问题 💬欢迎交流:在学习过程中如果你有任何疑问或想法,欢迎在评论区留言,我们可以共…

MySQL笔记4

一、范式1.概念与意义范式(Normal Form)是数据库设计需遵循的规范,解决“设计随意导致后期重构困难”问题。主流有 三大范式(1NF、2NF、3NF),还有进阶的 BCNF、4NF、5NF 等,范式间是递进依赖&am…

切比雪夫不等式的理解以及推导【超详细笔记】

文章目录参考教程一、意义1. 正态分布的 3σ 法则2. 不等式的含义3. 不等式的意义二、不等式的证明1. 马尔科夫不等式马尔可夫不等式证明(YYY 为非负随机变量 )2. 切比雪夫不等式推导参考教程 一个视频,彻底理解切比雪夫不等式 一、意义 1. 正态分布的…

Spring Boot Jackson 序列化常用配置详解

一、引言在当今的 Web 开发领域,JSON(JavaScript Object Notation)已然成为数据交换的中流砥柱。无论是前后端分离架构下前后端之间的数据交互,还是微服务架构里各个微服务之间的通信,JSON 都承担着至关重要的角色 。它…

Jetpack ViewModel LiveData:现代Android架构组件的核心力量

引言在Android应用开发中,数据管理和界面更新一直是开发者面临的重大挑战。传统的开发方式常常导致Activity和Fragment变得臃肿,难以维护,且无法优雅地处理配置变更(如屏幕旋转)。Jetpack中的ViewModel和LiveData组件正…

Python数据分析案例79——基于征信数据开发信贷风控模型

背景 虽然模型基本都是表格数据那一套了,算法都没什么新鲜点,但是本次数据还是很值得写个案例的,有征信数据,各种,个人,机构,逾期汇总..... 这么多特征来做机器学习模型应该还不错。本次带来&…

板凳-------Mysql cookbook学习 (十二--------3_2)

3.3链接表 结构 P79页 用一个类图来表示EmployeeNode类的结构,展示其属性和关系: plaintext ----------------------------------------- | EmployeeNode | ----------------------------------------- | - emp_no: int …

深度学习图像预处理:统一输入图像尺寸方案

在实际训练中,最常见也最简单的做法,就是在送入网络前把所有图片「变形」到同一个分辨率(比如 256256 或 224224),或者先裁剪/填充成同样大小。具体而言,可以分成以下几类方案:一、图…

pytest-log

问题1:我们在运行测试用例的时候如何记录测试的log,如何使用?问题2:我写的函数,为了方便log记录,但是在pytest运行时,会兼容pytest且不会重复记录,怎么解决?1、pytest有内…

在安卓源码中添加自定义jar包给源码中某些模块使用

一、具体步骤 1. 准备目录与 Jar 包 在vendor下 创建新的模块目录,放入demo.jar 包: demojar/ # 模块目录 ├── Android.bp # 编译配置文件 └── demo.jar 2. 编写 Android.bp 配置 Android.bp 示例配置: java_import {…

buntu 22.04 上离线安装Docker 25.0.5(二)

以下有免费的4090云主机提供ubuntu22.04系统的其他入门实践操作 地址:星宇科技 | GPU服务器 高性能云主机 云服务器-登录 相关兑换码星宇社区---4090算力卡免费体验、共享开发社区-CSDN博客 兑换码要是过期了,可以私信我获取最新兑换码!&a…