网络编程Udp协议

news2024/11/13 23:38:53

文章目录

  • 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.coloradmin.cn/o/2134402.html

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

相关文章

电脑怎么录制视频?游戏直播、教学分享必备!

在数字化时代,电脑录屏已成为游戏直播、教学分享、会议记录等多种场景下的必备技能,但有些朋友可能不知道怎么高效又清晰的录制视频,下面就给大家汇总了几个简单方法,一起来学习下吧~ 1. 嗨格式录屏大师 录屏大师软件免费下载_高…

方位大模型教程:从基础入门到实战应用

2024年大西洋彼岸的OpenAi公司,首次向世界吹响「大模型主导未来世界变革」的号角。 AI大模型,正在构建的颠覆力,为了更好的入局AI大模型,这次我特意复盘和整理大模型学习脉络,开了30节大模型的课程,包含大…

推荐一个java屏幕共享项目

java 屏幕共享项目 https://github.com/SpringStudent/JavaDesktopShare

【JAVA入门】Day44 - 字节打印流和字符打印流

【JAVA入门】Day44 - 字节打印流和字符打印流 文章目录 【JAVA入门】Day44 - 字节打印流和字符打印流一、字节打印流二、字符打印流三、输出语句和打印流的关系 打印流也是一种高级包装流,但是它只有输出,没有输入。 打印流一般是指:…

Qt_控件的QWidget属性介绍

目录 1、QWidget的核心属性 2、enabled 3、geometry 3.1 代码测试geometry 4、windowTitle 4.1 代码测试windowTitle 5、windowIcon 5.1 QIcon设置图标 5.2 qrc机制 5.3 代码测试windowIcon 6、windowOpacity 6.1 代码测试windowOpacity 7、cursor 7.1 代码测试…

使用xjar+exe4j+inno setup把加密后的jar打包成exe应用程序并创建服务

1、使用xjar对jar包进行加密 在项目的pom.xml中加入xjar的插件依赖&#xff0c;最好用2.x.x版本&#xff0c;高版本不支持-Dxjar.mode&#xff0c;无法免密码启动 github地址&#xff1a;xjar-maven-plugin <plugin><groupId>com.github.core-lib</groupId>…

RDD2022 道路瑕疵检测数据集

RDD2022 道路瑕疵数据集 txt标签或者xml标签 一共23767张图片 D00 D01 D20 D40四类 D00纵向裂缝 D10横向裂缝 D20网状裂缝 D40坑洞。 RDD2022 道路瑕疵检测数据集介绍 数据集概述 RDD2022&#xff08;Road Defect Detection 2022&#xff09;是一个专门用于道路瑕疵检测的数…

【MATLAB GUI 设计第一篇 】

文章目录 前言一、MATLAB GUI 是什么&#xff1f;二、guide 的使用1.进入GUI界面2. 布置绘图3.修改字体4. 回调函数&#xff0c;完成功能5. 整个函数和回调函数6.修改回调函数7. 显示效果8. 补充 三、 APP 的使用1.进入APP界面2.在 APP 菜单下 新建空白APP3.创建回调函数4.显示…

OpenCV class2-C#+winfrom显示控件使用窗口大小并内存管理

一.控件效果说明 二.代码声明&#xff08;已经循环读取10000次&#xff09; 全局 OpenCvSharp.Point point new OpenCvSharp.Point(0, 0); OpenCvSharp.Size size2; Mat src new Mat(); 初始化 size2 new OpenCvSharp.Size(pictureBox1.Size.Width, pictureBox1.Size.Hei…

京东技术专家的修炼之道|“六边形战士”周默分享

前言 最近&#xff0c;京东零售智能增长研发总监周默在京东内部分享了他在京东工作近10年的经验与成长。周默自2015年加入京东以来&#xff0c;经历了后端架构、大数据、基础算法和业务算法等多个技术领域&#xff0c;获得了集团金项奖、最美京东人、集团算法大牛等多项荣誉&a…

C语言错题本

本学渣在一个人学习的途中遇到过许多问题 如果没有老师的帮助可能很长时间都走不出来 所以我也希望我的错误能帮助到你 9月13日 题一 未赋值的局部指针是野指针(C) 题二 PS:对于指针来说&#xff0c;传递的是指针值的副本&#xff0c;point 函数内部对 p 的任何修改都不会影响…

ClickHouse的安装配置+DBeaver远程连接

1、clickhouse的下载&#xff1a; 先去clickhouse官网进行下载&#xff0c;继续往下翻找文档&#xff0c;将DBeaver也下载下来 下载地址&#xff1a;https://packages.clickhouse.com/rpm/stable/ 下载这个四个rpm包 2、上传rmp文件到Linux中 自己创建的一个clickhouse-ins…

3DGS:3D Gaussian Splatting for Real-Time Radiance Field Rendering 论文解读

目录 一、导言 二、相关工作 1、传统场景重建 2、神经渲染与辐射场 3、点云渲染 三、3DGS 1、SFM初始化稀疏点云 2、3D高斯椭球 3、协方差 4、球谐函数 5、3D高斯椭球集建立 6、3D投影2D 7、3D渲染公式 四、损失函数 五、基于梯度自适应改变点云的分布方式 六…

第四天旅游线路预览——从贾登峪到喀纳斯景区入口(贾登峪游客服务中心)

第四天&#xff1a;从贾登峪到喀纳斯风景区入口&#xff0c;晚上住宿贾登峪&#xff1b; 从贾登峪到喀纳斯景区入口&#xff08;贾登峪游客服务中心&#xff09;&#xff1a; 1&#xff09;早上8&#xff1a;00起床&#xff0c;吃完早饭&#xff0c;8&#xff1a;30出发&#…

Leetcode 旋转图像

解题思路&#xff1a; 转置矩阵&#xff1a;通过将矩阵的行列互换来实现转置操作。水平翻转矩阵&#xff1a;通过将每行的数据进行对称交换&#xff0c;从而完成90度旋转。 通过这两个步骤&#xff0c;矩阵就会顺时针旋转90度。 class Solution { public:void rotate(vector…

Unity报错:error CS8805: Program using top-level statements must be an executable.

大多数人都不想犯错&#xff0c;但压力大时总是动作变形 大概意思网上查了一下&#xff0c;就是说 C# 的第一&#xff08;top)行有错误&#xff0c;或者类&#xff08;类的头部&#xff09;就没写全 这什么意思呢&#xff1f;又定位不到具体是哪个类 但肯定是刚修改了一点点代…

RocketMQ 基本概念

RocketMQ的由来 随着使⽤中队列和虚拟主题的增加&#xff0c;阿⾥巴巴团队使⽤的 ActiveMQ IO 模块达到了瓶颈。为了尽⼒通过节流、断路器或降级来解决这个问题&#xff0c;但效果不佳。所以开始 关注当时流⾏的消息传递解决⽅案Kafka 。不幸的是&#xff0c; Kafka ⽆法满⾜…

【linux笔记dpkg-buildpackage打包】把一个helloworld程序打包为deb包

说明 打包发布可以不用编译源代码安装&#xff0c;看起来是更方便的软件拷贝方式&#xff0c;下面是一个dpkg-buildpackage工具的最简打包过程实例 先建立一个helloworld程序 main.c #include <stdio.h>int main() {printf("Hello, World!\n");return 0; }…

小程序开关组件

前提是vant组件库不太好改&#xff0c;干脆就手写了一个 <template><view class"switch-container" click"toggleOrder"><view :class"[switch-text, left-text, { left-textChoose: isReverseOrder }]">{{ leftText }}</…