JAVAEE—实现一个UDP通信的demo

文章目录

  • UDP的特点
    • 无连接的
    • 不可靠性
    • 面向报文
    • 阻塞控制
  • 实现UDP通信需要的类和方法
    • DatagramSocket API
    • DatagramPacket API
      • 构造方法
      • DatagramPacket 常用方法
    • InetSocketAddress API
  • 实现UDP通讯的代码
    • UDP 服务器
    • UDP客户端

UDP的特点

无连接的

首先UDP是无连接的,什么是无连接的呢?无连接的意思就是在发送消息的过程中发消息的一方和收消息的一方都不会保存对方的信息。因此我们说他是无连接的,既然是无连接的那么每一次我们发送的消息其实这个信息中不止包含我们想要发送的消息,还包含了对方的IP地址和端口号以及自己的IP地址和端口号。因此就涉及到了另一个特性那就是面向报文传输

不可靠性

不可靠性,为什么说UDP传输时不可靠的呢?这要跟他的传输方式有关因为UDP的传输时尽自己最大能力的传输消息因此它并不保证这个消息能够准确并且完整的传输到对方的手中因此我们说他是不可靠的。

面向报文

面向报文传输。这里跟我们的无连接性其实是有关系的,由于UDP是没有连接的即不会保存通信双方的信息,因此每一次的发送都需要我们将要发送的数据以及发送方的IP地址端口号以及接受方的IP地址端口号进行打包。

阻塞控制

UDP没有拥塞控制,因此网络出现的拥塞不会使源主机的发送速率降低。很多的实时应用(如IP电话、实时视频会议等)要去源主机以恒定的速率发送数据,并且允许在网络发生拥塞时丢失一些数据,但却不允许数据有太多的时延。UDP正好符合这种要求。

实现UDP通信需要的类和方法

DatagramSocket API

DatagramSocket 是UDP Socket,用于发送和接收UDP数据报。
DatagramSocket 构造方法

方法签名方法使用
DatagramSocket()创建一个UDP数据报套接字的Socket,绑定到本机任意一个随机端口(一般用于客户端)
DatagramSocket(int port)创建一个UDP数据报套接字的Socket,绑定到本机指定的端口(一般用于服务端)

DatagramSocket 方法

方法签名方法使用
void receive(DatagramPacket p)从此套接字接收数据报(如果没有接收到数据报,该方法会阻塞等待)
void send(DatagramPacketp)从此套接字发送数据报包(不会阻塞等待,直接发送)
void close()关闭此数据报套接字

DatagramPacket API

DatagramPacket 类是用来保存UDP通讯中发送和接受的数据报

构造方法

方法名称方法说明
DatagramPacket(byte[]buf, int length)构造一个DatagramPacket 对象并且内部传入一个字节数组,我们要接受的信息全部都存入到这个字节数组中,接受的内容存储在第一个参数buf中接受的指定长度为第二个参数
DatagramPacket(byte[]buf, int offset, int length,SocketAddress address)构造一个DatagramPacket 对象用来发送数据发送的数据内容存储在第一个参数buf中发送的数据是字节长度存储到第二个和第三个参数中,最后一个参数address用来存储目标的IP地址和端口号

DatagramPacket 常用方法

方法签名方法说明
InetAddress getAddress()从接收的数据报中,获取发送端主机IP地址;或从发送的数据报中,获取接收端主机IP地址
int getPort()从接收的数据报中,获取发送端主机的端口号;或从发送的数据报中,获取接收端主机端口号
byte[] getData()获取数据报中的数据

构造UDP发送的数据报时,需要传入 SocketAddress ,该对象可以使用 InetSocketAddress 来创
建。

InetSocketAddress API

InetSocketAddress ( SocketAddress 的子类 )构造方法:

方法签名方法说明
InetSocketAddress(InetAddress addr, int port)创建一个Socket地址,包含IP地址和端口号

实现UDP通讯的代码

UDP 服务器

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
class UDPserver{private DatagramSocket socket=null;public UDPserver(int port) throws SocketException {socket=new DatagramSocket(port);}public void start() throws IOException {System.out.println("服务器正常启动");while(true){//接收请求DatagramPacket requestPacket =new DatagramPacket(new byte[1024],1024);socket.receive(requestPacket);String reques=new String(requestPacket.getData(),0,requestPacket.getLength());//创建回应信息String Response=po(reques);DatagramPacket responsePacket=new DatagramPacket(Response.getBytes(),0,Response.getBytes().length,requestPacket.getSocketAddress());socket.send(responsePacket);System.out.printf("[%s,%s,%s,%d]:%s",requestPacket.getAddress(),"发送到",responsePacket.getAddress(),requestPacket.getPort(),Response);}}public String po(String s){return s;}
}public class Udpsever {public static void main(String[] args) throws IOException {UDPserver udPserver=new UDPserver(9090);udPserver.start();}
}

UDP客户端

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Scanner;class UDPclient{private DatagramSocket datagramSocket=null;private String IP;private int Port;public UDPclient(String Ip,int port) throws SocketException {IP=new String(Ip);Port=port;datagramSocket=new DatagramSocket();}public void start() throws IOException {while(true){System.out.print("请输入你的请求->");Scanner scanner=new Scanner(System.in);String reques=scanner.nextLine();DatagramPacket requesgramPacket=new DatagramPacket(reques.getBytes(), reques.getBytes().length,InetAddress.getByName(IP),Port);DatagramPacket responsegramPacket=new DatagramPacket(new byte[1024],1024);datagramSocket.send(requesgramPacket);datagramSocket.receive(responsegramPacket);String responce=new String(responsegramPacket.getData(),0,responsegramPacket.getLength());System.out.println("response:"+responce);}}
}
public class Main {public static void main(String[] args) throws IOException {UDPclient udPclient=new UDPclient("127.0.0.1",9090);udPclient.start();}
}

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

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

相关文章

TRON x HTX DAO 2024 香港之夜:共建香港元宇宙金融自由港

4月9日,由波场TRON主办,HTX DAO协办的“TRON x HTX DAO 2024 香港之夜”主题活动在香港盛大举行。多位参与HTX DAO生态建设的项目方代表、委员会成员、知名KOL等出席并就HTX DAO发展及加密业态进行演讲。 活动现场,波场TRON创始人孙宇晨通过视…

详解Spring event如何优雅实现系统业务解耦、实现原理及使用注意项

1.概述 在我们平时的项目业务系统开发过程中,一个需求功能的业务逻辑经常出现主线业务和副线业务之分。比如,在当下移动端电商app进行注册账号操作,注册成功之后会发送短信、邮箱、站内信等通知,发放红包活动抵用券,推…

git commit -m提交后如何回退和直接覆盖当前提交记录

在 Git 中,如果你已经执行了 git commit -m "你的提交信息" 并希望回退或覆盖这个提交,有几种方法可以实现。以下是针对这两种需求的解决方案: 回退提交 如果你想回退最近的提交(即撤销上次的提交)&#x…

LinuxAndroid: 旋转编码器input输入事件适配(旋转输入)

rk3588s: 旋转编码器input输入事件适配 基于Android 12 kernel-5.10版本 参考文档: https://blog.csdn.net/szembed/article/details/131551950 Linux 输入设备调试详解(零基础开发)Rotary_Encoder旋转编码器驱动 通用GPIO为例 挂载input输…

日志监控思路分享,只监控日志内容,不存储

有一个这样的需求,就是实时监控日志文件的内容,不需要存储,仅当某行日志内容触发某个规则时调用一段业务逻辑就行了。比如用户触发限流规则,就将其封禁并发送钉钉通知到运维群。 看到这个需求首先想到的就是日志采集工具&#xff…

在 CentOS 7 上安装 Redis

在 CentOS 7 上安装 Redis 可以通过几个简单的步骤完成。以下是一种常用的方法: 更新系统: 在安装任何新软件之前,最好先更新系统的软件包列表,以确保安装的软件版本是最新的。可以使用以下命令来更新: sudo yum up…

零售EDI:Princess Auto EDI对接

Princess Auto 是一家加拿大零售连锁店,专门从事农场、工业、车库、液压和剩余物品的销售。 Princess Auto 总部位于马尼托巴省温尼伯,截至 2024 年 1 月在 10 个省份拥有并经营 55 家商店以及三个配送中心。各种商品均以其“Powerfist”和“Pro.Point”…

HTML5 有哪些新特性

HTML5 是 HTML 标准的一个重大更新&#xff0c;它引入了许多新特性和改进&#xff0c;旨在提高 Web 应用的性能、互交性和多媒体支持。以下是 HTML5 的一些关键新特性&#xff1a; 1. 语义化标签 新增了一系列语义化标签&#xff0c;如 <article>、<section>、&l…

Node.js 入门

一、什么是 Node.js&#xff1f; 定义&#xff1a; 作用&#xff1a;使用 Node.js 编写服务器端程序 编写数据接口&#xff0c;提供网页资源浏览功能等等 前端工程化&#xff1a;为后续学习 Vue 和 React 等框架做铺垫 二、什么是前端工程化&#xff1f; 前端工程化&#xf…

红米手机怎么安装charles证书(Redmi K70)

我们到知道通过charles抓Https的包需要给手机安装charles证书才行&#xff0c;正常来说设置代理后&#xff0c;在手机系统浏览器中输入chls.pro/ssl就会下载安装证书。但是&#xff0c;在红米手机上就是下载不下来。 通过如下方法配置&#xff1a; 手机wifi网络配置代理手机浏…

学浪视频怎么下载到手机相册

学浪视频如何下载到手机相册&#xff0c;很简单&#xff0c;首先将学浪课程下载到电脑&#xff0c;然后再由电脑传输到手机中&#xff0c;这样你就可以在手机相册里面观看。 但是将学浪课程下载到本地是不可以使用录屏的方式&#xff0c;所以这里要借助一款工具&#xff0c;小…

【Java】线程邮局的三种用工方式对比

1. 继承Thread类 想象邮局有一支专门的邮差团队&#xff0c;每个邮差&#xff08;继承Thread类的子类&#xff09;都有自己的送信路线&#xff08;run方法&#xff09;。他们直接参与邮件的分发工作。 优点&#xff1a; 专业性&#xff1a;每个邮差都经过专业培训&#xff0…

自动化测试-web(弹窗/滚动条/鼠标/等待等操作)

一、弹窗 为什么要处理弹窗&#xff1f; 如果页面操作过程中&#xff0c;有弹窗出现&#xff0c;不处理&#xff0c;无法继续对页面操作。 弹窗类型&#xff1a; js原生弹窗&#xff1a; 警告框、输入框、提示框&#xff0c;这些必须处理 如何处理&#xff1a; 1&#xff0…

Node.js cnpm的安装

百度搜索 cnpm,进入npmmirror 镜像站https://npmmirror.com/ cmd窗口输入 npm install -g cnpm --registryhttps://registry.npmmirror.com

dyld: Library not loaded: @rpath/SDK.framework/SDK错误问题

关于导入三方SDK.framework之后&#xff0c;启动崩溃之后如下报错的解决方式: 截屏2020-10-14 上午9.55.09.png 在正常导入framework之后&#xff0c;做如图示操作&#xff0c; image.png 以上步骤之后&#xff0c;重新启动运行xcode&#xff0c;即可成功运行。

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之八 简单视频素描效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之八 简单视频素描效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之八 简单视频素描效果 一、简单介绍 二、简单指定视频某片段快放效果实现原理 三、简单指定视频某…

[leetcode]remove-duplicates-from-sorted-list

. - 力扣&#xff08;LeetCode&#xff09; 给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,1,2] 输出&#xff1a;[1,2]示例 2&#xff1a; 输入&…

安全风险攻击面管理如何提升企业网络弹性?

从研究人员近些年的调查结果来看&#xff0c;威胁攻击者目前非常善于识别和利用最具有成本效益的网络入侵方法&#xff0c;这就凸显出了企业实施资产识别并了解其资产与整个资产相关的安全态势的迫切需要。 目前来看&#xff0c;为了在如此复杂的网络环境中受到最小程度上的网络…

Unity Pro 2019 for Mac:专业级游戏引擎,助力创意无限延伸!

Unity Pro 2019是一款功能强大的游戏开发引擎&#xff0c;其特点主要体现在以下几个方面&#xff1a; 强大的渲染技术&#xff1a;Unity Pro 2019采用了新的渲染技术&#xff0c;包括脚本化渲染流水线&#xff0c;能够轻松自定义渲染管线&#xff0c;通过C#代码和材料材质&…

Asp.net 使用了 bootstrap,发布时样式丢失了

究其原因其实是css文件压缩了以后&#xff0c;页面不能识别了 其实一般只需要用到 bootstrap.css 和 site.css 修改 Global.asax void Application_Start(object sender, EventArgs e){// 默认情况下&#xff0c;启用优化&#xff0c;将捆绑和最小化脚本和样式文件// 为了在…