网络编程Udp协议

文章目录

  • UDP协议
    • 1、什么是UDP协议?
      • 一、定义与基本概念
      • 二、主要特点
      • 三、报文格式
      • 四、应用场景
      • 五、总结
    • 2、如何使用Java中的UDP套接字?
      • 一、UDP常用API
        • DatagramSocket
        • DatagramPacket
      • 二、UDP协议下的客户端-服务器
        • 服务器
        • 客户端

UDP协议

UDP协议,全称为用户数据报协议(User Datagram Protocol),是一种工作在OSI(开放系统互连)模型中传输层的无连接协议。以下是关于UDP协议的详细介绍:

1、什么是UDP协议?

一、定义与基本概念

  • 定义:UDP为应用程序提供了一种以最少的协议机制向其他程序发送消息的过程。它使用IP作为底层协议,为应用层提供一种简单的、不可靠的、无连接的数据传输服务。
  • 标准:UDP的正式规范由IETF(互联网工程任务组)提供,具体为RFC 768。

二、主要特点

  1. 无连接:UDP在发送数据前不进行连接,发送结束时也没有连接可以释放,这减少了开销和发送数据之前的时延。
  2. 不可靠UDP不保证数据包的可靠传输,如果数据包在传输过程中丢失或损坏,UDP不会尝试重新发送或恢复数据。使用UDP的应用需要自己处理数据包的丢失和错误检测。
  3. 面向数据报:UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。UDP一次交付完整的报文,因此应用程序必须选择合适大小的报文。
  4. 无拥塞控制:UDP没有拥塞控制机制,这使其适合那些允许网络拥塞时丢失数据,但不允许数据有太大时延的实时应用。
  5. 支持多播和广播:UDP支持一对一、一对多、多对一和多对多的交互通信,适用于需要在多个接收方之间共享数据的应用。
  6. 首部开销小:UDP只有8个字节的首部,相比于TCP的20个字节首部,UDP的额外开销更小,使得UDP在传输小数据包时更加高效

三、报文格式

UDP报文由首部和数据两部分组成。首部包含以下字段(均用16位二进制数表示(2字节)):

  • 源端口源端口号,在要求对方回信时选用,不要求时可使用全0
  • 目的端口:目的端口号,在终点交付报文时必须使用。
  • 长度:UDP用户数据报的长度,包括首部和数据,其最小值是8(仅有首部),最大值为65535,单位为字节,因此一个UDP数据报最多能承载的数据为64KB
  • 检验和:采用CRC校验法用于检测UDP用户数据包在传输中是否有错,如果出错则将报文丢弃
    在这里插入图片描述

四、应用场景

由于UDP具有传输速度快、延迟低、开销小等特点,它被广泛应用于对实时性要求较高的场景,如:

  • 视频和音频流传输:如视频会议、实时直播等,UDP能够提供快速且高质量的数据传输。
  • 在线游戏:实时多人在线游戏对数据传输的实时性要求极高,UDP的快速处理海量数据包的能力使其成为这类应用的理想选择。
  • DNS查询:DNS系统使用UDP协议进行域名解析,能够快速检查DNS错误并确保网址的迅速解析。
  • 网络广播:如校园广播、公司内部通知广播等,UDP的广播功能能够迅速、高效地传达信息给所有接收者。

五、总结

UDP协议以其无连接、不可靠、基于数据报的传输方式,在网络通信中发挥着重要作用。虽然它无法保证数据的可靠传输,但其快速、低延迟和高效的特点,使得UDP成为许多实时性要求高的应用的理想选择。

2、如何使用Java中的UDP套接字?

一、UDP常用API

DatagramSocket
  • 基本概念

    1. DatagramSocket类位于Java的java.net包中,它提供了发送和接收数据报(datagram)的功能,这些数据报是通过UDP协议进行传输的。
    2. DatagramSocket本身不维护状态,不能产生IO流,其唯一作用就是接收和发送数据报。数据报的发送和接收通常是通过与DatagramSocket配合使用的DatagramPacket对象来完成的。
  • 构造方法

    DatagramSocket提供了多种构造函数,以便创建绑定到特定端口或IP地址的套接字。常见的构造方法包括:

    • DatagramSocket():创建一个DatagramSocket实例,并将该对象绑定到本机默认IP地址、本机所有可用端口中随机选择的某个端口,常用于客户端系统
    • DatagramSocket(int port):创建一个DatagramSocket实例,并将该对象绑定到本机默认IP地址、指定端口,常用于服务器系统
    • DatagramSocket(int port, InetAddress laddr):创建一个DatagramSocket实例,并将该对象绑定到指定IP地址、指定端口。
  • 主要功能

    • 发送数据报:通过调用DatagramSocket的send(DatagramPacket p)方法,可以将封装了数据、目标地址和端口的DatagramPacket对象发送出去。DatagramSocket本身并不知道数据报的具体目的地,这些信息由DatagramPacket对象提供。
    • 接收数据报:通过调用DatagramSocket的receive(DatagramPacket p)方法,可以接收一个数据报。这个方法会阻塞调用它的线程,直到接收到一个数据报为止。接收到的数据报会存储在传入的DatagramPacket对象的字节数组中。
  • 高级特性

    • 设置超时:可以通过调用setSoTimeout(int timeout)方法为DatagramSocket设置接收操作的超时时间。如果在指定的时间内没有接收到数据报,则接收操作将抛出SocketTimeoutException异常
    • 广播和多播:UDP协议支持广播和多播。广播允许将数据报发送到网络上的所有设备,而多播则允许将数据发送到特定组的多个主机。在Java中,可以通过设置DatagramPacket的目标地址为广播地址(如255.255.255.255)来实现广播发送。多播则需要使用专门的MulticastSocket类。
  • 注意事项

    • 数据完整性:由于UDP协议不保证消息传递的可靠性,因此在使用DatagramSocket进行通信时,需要在应用程序层面实现传输可靠性,如通过重传机制等。
    • 资源管理:使用完DatagramSocket后,应该调用其close()方法释放资源,以避免资源泄露。
DatagramPacket
  • 基本概念

    1. DatagramPacket是Java中用于网络通信的一种数据包,特别是在UDP协议的通信中扮演着重要角色。
    2. DatagramPacket类封装了数据报的内容和目标地址信息,以便在网络上进行传输。数据报(Datagram)是网络层中的传输单元,它可能被压缩成一个或几个数据包(Packet)在数据链路层中传输。在Java中,DatagramPacket就是用来实现这种数据报传输的类。
  • 主要功能

    1. 数据报发送:通过创建一个DatagramPacket对象,可以将数据报的内容和目标地址信息封装起来。然后,可以使用DatagramSocket类的send()方法将该数据报发送到网络上的目标地址。
    2. 数据报接收:通过创建一个DatagramPacket对象,可以指定一个缓冲区来接收从网络上接收到的数据报。然后,可以使用DatagramSocket类的receive()方法将接收到的数据报存储到该缓冲区中。
    3. 数据报解析:通过使用DatagramPacket对象的方法,可以获取数据报的内容、长度、目标地址等信息。这些信息可以用于解析和处理接收到的数据报。
  • 构造方法

    DatagramPacket类提供了多个构造方法,以适应不同的使用场景:

    • DatagramPacket(byte[] buf, int length):用于接收数据,buf是保存传入数据报的缓冲区,length是要读取的字节数。
    • DatagramPacket(byte[] buf, int offset, int length):用于接收数据,在缓冲区中指定了偏移量。
    • DatagramPacket(byte[] buf, int length, InetAddress address, int port):用于发送数据,buf是包数据,length是包长度,address是目的地址,port是目的端口号。
    • DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port):用于发送数据,同时指定了数据在缓冲区中的偏移量。
  • 关键方法

    • getData():返回数据缓冲区。
    • getLength():返回将要发送或接收到的数据的长度。
    • getPort():返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的。
    • getAddress():返回某台机器的IP地址,此数据报将要发往该机器或者是从该机器接收到的。
    • setData(byte[] buf, int offset, int length):为此包设置数据缓冲区。
    • setAddress(InetAddress iaddr):设置要将此数据报发往的那台机器的IP地址。
    • setPort(int port):设置要将此数据报发往的远程主机上的端口号。
  • 注意事项

    • 使用DatagramSocket和DatagramPacket进行网络通信时,需要先建立DatagramSocket对象,然后使用DatagramPacket对象作为传输数据的载体。
    • 由于UDP协议是无连接的协议,因此通信双方都需要先建立一个DatagramSocket对象,才能进行通信。
    • UDP协议不保证数据包的顺序、不保证数据包的可靠性,也不保证数据包一定能够到达对方,因此在设计应用时需要考虑到这些因素。

二、UDP协议下的客户端-服务器

以下是关于如何建立一个Udp为协议的回显客户端-服务器程序:

服务器
  1. 接收请求
    创建一个DatagramSocket用于监听某个服务器的固定端口(服务器需要绑定特定端口这样客户端才能发送请求到服务器);
    创建空数据报DatagramPacket,接收请求。
  2. 解析请求
    将数据报的内容解析成字符串。
  3. 根据请求计算响应
    对已解析的请求进行计算得到响应内容。
  4. 将响应传回客户端
    将响应内容打包成数据报传回客户端。
public class UdpEchoServer {private DatagramSocket socket = null;public UdpEchoServer(int port) throws SocketException {// 创建一个socket对象监听某个固定端口socket = new DatagramSocket(port);}public void start() throws IOException {System.out.println("服务器启动");while(true) {// 1.读取请求并解析// 用一个空的数据报接收请求DatagramPacket requestPacket = new DatagramPacket(new byte[4096], 4096);socket.receive(requestPacket);// 2.解析请求,将数据报的内容解析成字符串String request = new String(requestPacket.getData(),0,requestPacket.getLength());// 3.根据请求计算响应String response = process(request);// 4.把响应写回到客户端DatagramPacket responsePacket = new DatagramPacket(response.getBytes(), 0,response.getBytes().length,requestPacket.getSocketAddress());socket.send(responsePacket);System.out.printf("[%s:%d] rep:%s, resp: %s\n",requestPacket.getAddress(),requestPacket.getPort(),request,response);}}public String process(String request){return request;}
}
客户端
  1. 生成请求并发送
    创建一个DatagramSocket对象,但是通常不用绑定特定端口
    生成请求并打包成DatagramPacket数据报发送给服务器。
  2. 接收响应并解析
    接收来自服务器响应(如果有),将接收到的来自服务器的响应解析并显示出来。
  3. 根据响应作出进行下一步操作
    如将响应显示出来。
public class UdpEchoClient {private DatagramSocket socket = null;private String serverIp;private int serverPort;public UdpEchoClient(String serverIp, int serverPort) throws SocketException {// 创建一个socket对象用于发送和接收数据报socket = new DatagramSocket();this.serverIp = serverIp;this.serverPort= serverPort;}public void start() throws IOException {Scanner scan = new Scanner(System.in);System.out.println("客户端启动");while(true) {// 1. 生成请求并发送System.out.print("输入请求:");String request = scan.next();DatagramPacket requestPacket = new DatagramPacket(request.getBytes(),0,request.getBytes().length,InetAddress.getByName(serverIp), serverPort);socket.send(requestPacket);// 2. 接收来自服务器返回的响应DatagramPacket responsePacket = new DatagramPacket(new byte[4096],4096);socket.receive(responsePacket);// 3. 解析响应并显示String response = new String(responsePacket.getData(),0,responsePacket.getLength());System.out.println(response);}}
}```

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

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

相关文章

微软发布Win11 24H2 九月累计更新补丁KB5043080!

系统之家于9月13日发出最新报道,微软面向Win11 24H2用户推送了九月最新更新补丁KB5043080,系统更新后,版本号将升至26100.1742。本次更新解决了任务管理器不正确显示的情况,还进行了多项改进。接下来,跟随小编一起深入…

小程序的右侧抽屉开关动画手写效果

<template><view><button click"openDrawer">打开抽屉</button><view v-if"showDrawer" class"drawer" :style"{ backgroundColor: bgColor }" click"closeDrawer"><view class"draw…

微信小程序登录与获取手机号 (Python)

文章目录 相关术语登录逻辑登录设计登录代码 相关术语 调用接口[wx.login()]获取登录凭证&#xff08;code&#xff09;。通过凭证进而换取用户登录态信息&#xff0c;包括用户在当前小程序的唯一标识&#xff08;openid&#xff09;、微信开放平台账号下的唯一标识&#xff0…

Unity 之 【Android Unity FBO渲染】之 [Unity 渲染 Android 端播放的视频] 的一种方法简单整理

Unity 之 【Android Unity FBO渲染】之 [Unity 渲染 Android 端播放的视频] 的一种方法简单整理 目录 Unity 之 【Android Unity FBO渲染】之 [Unity 渲染 Android 端播放的视频] 的一种方法简单整理 一、简单介绍 二、FBO 简单介绍 三、案例实现原理 四、注意事项 五、简…

利用熵权法进行数值评分计算——算法过程

1、概述 在软件系统中&#xff0c;研发人员常常遇上需要对系统内的某种行为/模型进行评分的情况。例如根据系统的各种漏洞情况对系统安全性进行评分、根据业务员最近操作系统的情况对业务员工作状态进行打分等等。显然研发人员了解一种或者几种标准评分算法是非常有利于开展研…

word文档无损原样转pdf在windows平台使用python调用win32com使用pip安装pywin32

前提&#xff1a; windows环境下&#xff0c;并且安装了office套装&#xff0c;比如word,如果需要调用excel.也需要安装。在另外的文章会介绍。这种是直接调用word的。所以还原度会比较高。 需求&#xff1a; word文档转pdf,要求使用命令行形式&#xff0c;最终发布为api接口…

数据库基础知识---------------------------(1)

数据库分类 关系型数据库 以表格方式存储数据 例子&#xff1a; MySQL、Oracle、DB2、SQLserver等 特点&#xff1a; SQL结构程度较高、安全性高、查询效率较低 非关系型数据库 以键值方式存储数据 例子&#xff1a; Redis、Hbase、MongoDB等 特点&#xff1a; 查询效率…

(不用互三)AI绘画工具大比拼:Midjourney VS Stable Diffusion该如何选择?

文章目录 &#x1f4af;如何选择合适的AI绘画工具根据个人需求选择1. 您喜欢什么风格的绘画&#xff1f;2. 您想要创作什么主题的内容&#xff1f;3. 您对绘画工具的使用经验如何&#xff1f; 比较工具特点1. 工具的易用性和功能性如何&#xff1f;易用性&#xff1a;功能性&am…

Qt_自定义信号

目录 1、自定义信号的规定 2、创建自定义信号 3、带参数的信号与槽 4、一个信号连接多个槽 5、信号与槽的断开 结语 前言&#xff1a; 虽然Qt已经内置了大量的信号&#xff0c;并且这些信号能够满足大部分的开发场景&#xff0c;但是Qt仍然允许开发者自定义信号&#…

基于vue框架的宠物寄养系统3d388(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,宠物信息,宠物分类,寄养店,宠物寄养,宠物领养,家庭环境,用户宠物 开题报告内容 基于Vue框架的宠物寄养系统开题报告 一、引言 随着人们生活水平的提高和宠物文化的普及&#xff0c;宠物已成为许多家庭不可或缺的一员。因此&…

实战案例(5)防火墙通过跨三层MAC识别功能控制三层核心下面的终端

如果网关是在核心设备上面&#xff0c;还能用MAC地址进行控制吗&#xff1f; 办公区域的网段都在三层上面&#xff0c;防火墙还能基于MAC来控制吗&#xff1f; 采用正常配置模式的步骤与思路 &#xff08;1&#xff09;配置思路与上面一样 &#xff08;2&#xff09;与上面区…

万象奥科参展“2024 STM32全国巡回研讨会”—深圳站、广州站

9月3日-9月5日&#xff0c;万象奥科参展“2024 STM32全国巡回研讨会”— 深圳站、广州站。此次STM32研讨会将会走进全国11个城市&#xff0c;展示STM32在智能工业、无线连接、边缘人工智能、安全、图形用户界面等领域的产品解决方案及多样化应用实例&#xff0c;深入解读最新的…

Linux系统部署SmartKG(知识图谱安装)

基本要求 #docker需要高版本 Docker version 20.10.14, build a224086docker 20.10.14离线安装 SmartKG官网 官方详细文档 下载部署包 SmartKG官网 准备部署 #上传到服务器 [roottest-server01 opt]# ll SmartKG-master.zip -rw-r--r-- 1 root root 79708691 Sep 11 17:4…

c++基类和派生类对象的赋值转换——赋值兼容规则

1.引出 如下场景&#xff1a; 由于b是double类型&#xff0c;所以赋值给int类型的引用前&#xff0c;要先进行隐式类型转换&#xff0c;这中间会生成临时对象&#xff0c;类是对象具有常性&#xff0c;所以int&之前应该加上const。 但是下面的场景&#xff1a; 没有出现报…

亚马逊测评自建团队与工作室的五大优势亮点,打造高权重评价系统

亚马逊上的产品评价&#xff0c;其实就是为了让买家们说出他们的真实想法&#xff0c;这样卖家就能知道怎么把东西做得更好&#xff0c;让买家更满意&#xff0c;还能让卖东西的招数更给力。效果有以下几点&#xff1a; 1. 商品更靠谱&#xff1a;买家说好&#xff0c;大家就更…

基于SSM的校园志愿者管理系统的设计与实现---附源码76245

摘 要 本文基于SSM框架&#xff0c;设计并实现了一套校园志愿者管理系统&#xff0c;旨在提高校园志愿服务管理的效率和质量。系统主要包括管理员、志愿者和活动发布者三大角色&#xff0c;涵盖了志愿者管理、活动管理、公告管理等功能模块&#xff0c;采用了MySQL作为数据库&…

【计算机组成原理】详细解读带符号整数在计算机中的运算

有符号整数的运算 导读一、补码的优势二、补码的加法运算三、补码的减法运算四、原码、反码、补码的特性结语 导读 大家好&#xff0c;很高兴又和大家见面啦&#xff01;&#xff01;&#xff01; 经过前面的介绍&#xff0c;我们已经初步认识了有符号整数的三种表示形式&…

NPU 与 GPU 相比,有什么差别?| 技术速览

编者按&#xff1a; 随着2024年被业界誉为“AI PC元年”&#xff0c;各大笔记本电脑厂商纷纷推出搭载NPU的全新AI PC&#xff0c;而在介绍产品性能时&#xff0c;“NPU”一词频频被提及。但NPU和我们所熟知的GPU之间的区别究竟是什么&#xff1f; 我们今天为大家分享的这篇文章…

电水壶自复位热断循环测试合规性

在家用电器安全标准中,电水壶的安全性尤为重要,尤其是涉及热保护装置的部分。电水壶在日常使用中频繁接触高温水,极端情况下,温度可能异常升高。因此,为了确保用户的安全,热保护装置必须可靠工作。本文将探讨自复位热断路器(TCO)在电水壶中的作用,以及在100次循环测试…

如何在 Selenium 中获取网络调用请求?

引言 捕获网络请求对于理解网站的工作方式以及传输的数据至关重要。Selenium 作为一种 Web 自动化工具,可以用于捕获网络请求。本文将讨论如何使用 Selenium 在 Java 中捕获网络请求并从网站检索数据。 我们可以使用浏览器开发者工具轻松捕获网络请求或日志。大多数现代 Web…