面向数据报编程-UDP协议

目录

前言:

1.UDP协议API

1.1UDP编程原理

1.2DatagramSocket类

(1)DatagramSocket构造方法

(2)DatagramSocket普通方法

1.3DatagramPacket类

(1)DatagramPacket构造方法

(2)DatagramPacket普通方法

1.4InetSocketAddress类

2.代码案例

2.1服务器端

2.2客户端

2.3运行结果


前言:

在网络编程-002节中已经介绍了有关传输层UDP协议的基本知识,本节不再介绍有关UDP协议的基础内容,主要讲UDP协议的重点API及其使用方法,通过案例的形式完善。

序列:网络编程 - 003


1.UDP协议API

1.1UDP编程原理

 对于UDP协议来说,具有无连接,面向数据报的特征,即每次都是没有建立连接,并且一次发送全部数据报,一次接收全部的数据报。

Java中使用UDP协议通信,主要基于DatagramSocket类来发送或接收数据报套接字,并使用DatagramPacket作为创建的UDP数据报,DatagramPacket类对象就是UDP协议中Socket的数据报。

1.2DatagramSocket类

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

(1)DatagramSocket构造方法

构造方法如下:

构造方法方法说明
DatagramSocket()创建一个UDP数据报套接字的Socket,绑定到本机一个随机端口(一般用于客户端)
DatagramSocket(int port)创建一个UDP数据报套接字的Socket,绑定到本机指定的端口(一般用于服务端)
(2)DatagramSocket普通方法

普通方法如下:

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

1.3DatagramPacket类

(1)DatagramPacket构造方法

构造方法如下:

构造方法方法说明
DatagramPacket(byte[] buf , int length)构造一个DatagramPacket以用来接收数据报,接收的数据保存在字节数组(第一个参数buf)中,接收指定长度(第二个参数length)
DatagramPacket(byte[] buf , int offset , int length , SocketAddress address)构造一个DatagramPacket以用来发送数据报,发送的数据为字节数组(第一个参数buf)中,从offset到指定长度(第三个参数length)。address指定目的主机的IP和端口号

其中buf数组为输出型参数,offset默认为零,可以省略。

(2)DatagramPacket普通方法

普通方法如下:

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

1.4InetSocketAddress类

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

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

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

2.代码案例

 利用传输层的UDP协议,我们可以实现一个实例。在Idea控制台手动输入字符串内容,从客户端发送给服务器端,然后服务器端不做任何处理,直接再次返回给客户端同样的字符串。

2.1服务器端

代码如下:

public class EchoServer {//服务器端//1、创建一个DatagramSocket对象DatagramSocket socket = null;public EchoServer(int port) throws SocketException {//服务器端需要自己指定端口号socket = new DatagramSocket(port);//这么写就是手动指定端口号//socket = new DatagramSocket();//这么写就是系统自动分配端口号}public void start() throws IOException {System.out.println("服务器启动...");while (true){DatagramPacket requestPacket = new DatagramPacket(new byte[4096],4096);//requestPacket这个对象是用来承载数据的,在创建的时候需要创建一块内存空间来保存数据socket.receive(requestPacket);//当前完成的receive之后,数据是以二进制的形式存储到DatagramPacket中//还需要把这个二进制的数据转化成字符串的形式String request = new String(requestPacket.getData(),0,requestPacket.getLength());//范围为0到requestPacket.getLength(),requestPacket.getLength()表示数据的真实长度//2、根据请求,计算响应(服务器端最核心的作用)String response = process(request);//3、把响应写回到客户端//搞一个响应对象,DatagramPacket//把DatagramPacket构造刚才的数据,再通过send返回DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),0,response.getBytes().length,requestPacket.getSocketAddress());//指定数据内容,同时指定数据要发给谁socket.send(responsePacket);//4、打印一个日志,把这次的数据交互的详情给打印出来System.out.printf("[%s:%d] req = %s,resp = %s\n",responsePacket.getAddress().toString(),responsePacket.getPort(),request,response);}}public String process(String request) {//请求是啥样,响应就是啥样//回转响应的方法return request;}public static void main(String[] args) throws IOException {EchoServer server = new EchoServer(9090);//实例测试server.start();}
}

2.2客户端

代码如下:

public class EchoClient {//客户端private DatagramSocket socket = null;private String serverIP = "";private int serverPort = 0;public EchoClient(String ip,int port) throws SocketException {//创建这个对象不能手动指定端口socket = new DatagramSocket();//由于 UDP自身不会持有对端信息,就需要在应用程序里,把对端的情况给记录下来//这里咱们主要记录对端的ip和端口serverIP = ip;serverPort = port;}public void start() throws IOException {System.out.println("客户端启动...");Scanner scanner = new Scanner(System.in);while (true){//1、控制台读取数据,作为请求System.out.println(" -> ");String request = scanner.next();//2、把请求的内容构造成DatagramSocket对象,发送给服务器DatagramPacket requestPacket = new DatagramPacket(request.getBytes(),request.getBytes().length,InetAddress.getByName(serverIP),serverPort);socket.send(requestPacket);//3、尝试获取服务器响应DatagramPacket responsePacket = new DatagramPacket(new byte[4096],4096);socket.receive(responsePacket);//4、把响应给转换出字符串,并显示出来String response = new String(responsePacket.getData(),0,responsePacket.getLength());System.out.println(response);}}public static void main(String[] args) throws IOException {EchoClient client = new EchoClient("127.0.0.1",9090);client.start();}
}

2.3运行结果

在同时运行服务器端和客户端两段代码后,在客户端的控制台输入字符串,结果如图所示:

客户端:

服务器端:


以上便是对传输层的UDP协议API介绍,并举例说明了UDP协议的具体用法。

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

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

相关文章

2.6日学习打卡----初学RabbitMQ(一)

2.6日学习打卡 初识RabbitMQ、 一. MQ 消息队列 MQ全称Message Queue(消息队列),是在消息的传输过程中保 存消息的容器。多用于系统之间的异步通信。 同步通信相当于两个人当面对话,你一言我一语。必须及时回复 异步通信相当于通…

vs用msys2编译安装 gmp

1 下载 1.1下载MSYS2工具 MSYS2 1.2 下载gmp The GNU MP Bignum Library 2 使用windows的msys2命令窗口,有三个msys2命名窗口 mingw64 3 4 命令 pacman -Syu 重启: pacman -Su 安装: pacman -S mingw-w64-x86_64-gcc pacman -S mingw-w64-x86_64-make…

C语言函数的栈帧与销毁(面试亮点)

目录 如果你能熟练的掌握函数的栈帧与销毁在面试中是及其亮眼的加分项,所以我们来以实例来将解函数是如何实现栈帧与销毁的。 一. 函数栈帧 二.寄存器 三. 用例题讲解创建栈帧的过程 3.1 main 函数的反汇编代码。 第一步:给调用main函数的函数分配…

[职场] 如何通过运营面试_1 #笔记#媒体#经验分享

如何通过运营面试 盈利是公司的事情,而用户就是你运营的事情。你需要彻底建立一个庞大而有效的用户群,这样才能让你们的公司想盈利就盈利,想战略就战略,想融资就融资。 一般从事运营的人有着强大的自信心,后台数据分析…

JVM-虚拟机栈

虚拟机栈 Java虚拟机栈(Java Virtual Machine Stack)采用栈的数据结构来管理方法调用中的基本数据,先进后出(First In Last Out),每一个方法的调用使用一个栈帧(Stack Frame)来保存。 接下来以…

vue3 之 通用组件统一注册全局

components/index.js // 把components中的所组件都进行全局化注册 // 通过插件的方式 import ImageView from ./ImageView/index.vue import Sku from ./XtxSku/index.vue export const componentPlugin {install (app) {// app.component(组件名字,组件配置对象)…

D7 Elasticsearch-Mongodb(搜索记录)

我是南城余!阿里云开发者平台专家博士证书获得者! 欢迎关注我的博客!一同成长! 一名从事运维开发的worker,记录分享学习。 专注于AI,运维开发,windows Linux 系统领域的分享! 知…

mysql笔记:表设计原则

mysql笔记:表设计原则 表对应了一个实体 表与表之间的关系: 一对一 一对多 多对多 一对一关系 例如:用户 user和身份信息 info 子表的外键关联了父表的子健(类型必须一样) 一对多关系 以电商系统为例子 用户-商…

CSP-202012-1-期末预测之安全指数

CSP-202012-1-期末预测之安全指数 题目很简单&#xff0c;直接上代码 #include <iostream> using namespace std; int main() {int n, sum 0;cin >> n;for (int i 0; i < n; i){int w, score;cin >> w >> score;sum w * score;}if (sum > 0…

使用 Ant Design 的 Upload 组件实现图片

文章目录 使用 Ant Design 的 Upload 组件实现图片Upload组件itemRender自定义上传列表项的渲染方式修改图片名上传图片上传链接中添加 Bearer Token 的请求头onPreview{handlePreview}上传成功后&#xff0c;如何隐藏上传列表 使用 Ant Design 的 Upload 组件实现图片 Upload…

【第二十三课】最小生成树:prime 和 kruskal 算法(acwing858,859 / c++代码 )

目录 前言 Prime算法--加点法 acwing-858 代码如下 一些解释 Kruskal算法--加边法 acwing-859 并查集与克鲁斯卡尔求最小生成树 代码如下 一些解释 前言 之前学最短路的时候&#xff0c;我们都是以有向图为基础的&#xff0c;当时我们提到如果是无向图&#xf…

【深度学习】实验7布置,图像超分辨

清华大学驭风计划 因为篇幅原因实验答案分开上传&#xff0c; 实验答案链接http://t.csdnimg.cn/P1yJF 如果需要更详细的实验报告或者代码可以私聊博主 有任何疑问或者问题&#xff0c;也欢迎私信博主&#xff0c;大家可以相互讨论交流哟~~ 深度学习训练营 案例 7 &#xff1…

计算机毕业设计Python+django医院后勤服务系统flask

结合目前流行的 B/S架构&#xff0c;将医疗后勤服务管理的各个方面都集中到数据库中&#xff0c;以便于用户的需要。该平台在确保平台稳定的前提下&#xff0c;能够实现多功能模块的设计和应用。该平台由管理员功能模块,工作人员模块&#xff0c;患者模块&#xff0c;患者家属模…

基于SpringBoot的记账系统项目

点击以下链接获取源码&#xff1a;https://download.csdn.net/download/qq_64505944/88822660?spm1001.2014.3001.5503 Java项目-8 开发工具&#xff1a;IDEA/Eclipse,MySQL,Tomcat 项目框架&#xff1a;SpringBoot,layui 功能&#xff1a;可以按照类型和时间查询&#xff0c…

基于tomcat运行jenkins常见的报错处理

目录 1.jenkins.util.SystemProperties$Listener错误 升级jdk11可能遇到的坑 2.java.lang.RuntimeException: Fontconfig head is null, check your fonts or fonts configuration 3.There were errors checking the update sites: UnknownHostException:updates.jenkins.i…

notepad++成功安装后默认显示英文怎么设置中文界面?

前几天使用电脑华为管家清理电脑后&#xff0c;发现一直使用的notepad软件变回了英文界面&#xff0c;跟刚成功安装的时候一样&#xff0c;那么应该怎么设置为中文界面呢&#xff1f;具体操作如下&#xff1a; 1、打开notepad软件&#xff0c;点击菜单栏“Settings – Prefere…

Modern C++ 内存篇1 - std::allocator VS pmr

大年三十所写&#xff0c;看到就点个赞吧&#xff01;祝读者们龙年大吉&#xff01;当然有问题欢迎评论指正。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1. 前言 从今天起我们开始内存相关的话题&#xff0c;内存是个很大的话题&#xff0c;一时不…

探索未来:集成存储器计算(IMC)与深度神经网络(DNN)的机遇与挑战

开篇部分&#xff1a;人工智能、深度神经网络与内存计算的交汇 在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;已经成为科技领域的一股强大力量&#xff0c;而深度神经网络&#xff08;DNN&#xff09;则是AI的核心引擎之一。DNN是一种模仿人类神经系统运作…

sqli.bypass靶场本地小皮环境(1-5关)

1、第一关 http://sqli.bypass/index1.php 单引号报错id1 双引号正常id1&#xff0c;应该是单引号闭合 id1--注释符用不了&#xff0c;%20和都用不了 %0a可以用 没有报错&#xff0c;用布尔盲注&#xff0c;POC&#xff1a;id1%0aand%0asubstr(ss,1,1)s%0aand%0a11 脚本跑数…

大模型学习笔记二:prompt工程

文章目录 一、经典AI女友Prompt二、prompt怎么做&#xff1f;1&#xff09;注重格式&#xff1a;2&#xff09;prompt经典构成3&#xff09;简单prompt的python询问代码4&#xff09;python实现订阅手机流量套餐的NLU5&#xff09;优化一&#xff1a;加入垂直领域推荐6&#xf…