【Java 基础篇】Java UDP通信详解

news/2024/5/18 12:35:48 标签: java, udp, 单片机, 安全, windows, 开发语言, 网络协议

在这里插入图片描述

UDP(User Datagram Protocol)是一种无连接的网络传输协议,它不像TCP那样需要建立连接和维护状态,因此更加轻量级。UDP适用于那些对数据传输的实时性要求较高,可以容忍一定数据丢失的场景。本文将详细介绍Java中如何使用UDP协议进行网络通信,包括UDP套接字、数据传输、服务器和客户端的创建等。

1. UDP基础知识

1.1. UDP工作原理

UDP是一种面向数据报的协议,它将数据分成小块,每个数据块称为数据报。每个UDP数据报都包含了目标地址和端口号,数据报之间相互独立,不建立连接。UDP的工作原理如下:

  1. 发送方将数据分割成数据报,加上目标地址和端口号,然后通过网络发送出去。
  2. 接收方根据目标地址和端口号接收数据报,然后将数据还原成完整的消息。

1.2. UDP的特点

  • 无连接性:UDP不需要建立连接,发送方直接发送数据,接收方直接接收数据,无需三次握手等连接建立步骤。
  • 不可靠性:UDP不保证数据的可靠性和顺序性,数据可能会丢失或乱序。
  • 轻量级:UDP的头部开销小,传输效率高。
  • 广播和多播:UDP支持广播和多播,可以向多个目标发送数据。

2. Java UDP编程基础

Java提供了用于UDP编程的相关类,主要位于java.net包中。下面是UDP编程的基本步骤:

2.1. 创建UDP套接字

在Java中,可以使用DatagramSocket类来创建UDP套接字,用于发送和接收数据报。

java">import java.net.*;
java">// 创建UDP套接字
DatagramSocket socket = new DatagramSocket();

2.2. 发送UDP数据

使用DatagramPacket类来创建要发送的数据报,并将其发送到指定的目标地址和端口。

java">// 创建要发送的数据
byte[] sendData = "Hello, UDP!".getBytes();

// 指定目标地址和端口
InetAddress serverAddress = InetAddress.getByName("localhost");
int serverPort = 8888;

// 创建数据报
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, serverAddress, serverPort);

// 发送数据报
socket.send(sendPacket);

2.3. 接收UDP数据

使用DatagramPacket类来创建一个用于接收数据报的缓冲区,并接收来自指定端口的数据。

java">// 创建接收数据的缓冲区
byte[] receiveData = new byte[1024];

// 创建接收数据报
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);

// 接收数据报
socket.receive(receivePacket);

// 解析接收到的数据
String message = new String(receivePacket.getData(), 0, receivePacket.getLength());
System.out.println("收到消息:" + message);

2.4. 关闭UDP套接字

在完成UDP通信后,需要关闭UDP套接字以释放资源。

java">// 关闭UDP套接字
socket.close();

3. Java UDP服务器和客户端示例

下面是一个简单的Java UDP服务器和客户端示例:

UDP服务器端代码:

java">import java.net.*;

public class UDPServer {
    public static void main(String[] args) {
        try {
            // 创建UDP套接字并绑定到指定端口
            DatagramSocket serverSocket = new DatagramSocket(8888);

            System.out.println("服务器已启动,等待客户端连接...");

            // 创建接收数据的缓冲区
            byte[] receiveData = new byte[1024];



            while (true) {
                // 创建接收数据报
                DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);

                // 接收数据报
                serverSocket.receive(receivePacket);

                // 解析接收到的数据
                String message = new String(receivePacket.getData(), 0, receivePacket.getLength());
                System.out.println("收到消息:" + message);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

UDP客户端代码:

java">import java.net.*;

public class UDPClient {
    public static void main(String[] args) {
        try {
            // 创建UDP套接字
            DatagramSocket clientSocket = new DatagramSocket();

            // 创建要发送的数据
            String message = "Hello, UDP!";
            byte[] sendData = message.getBytes();

            // 指定服务器地址和端口
            InetAddress serverAddress = InetAddress.getByName("localhost");
            int serverPort = 8888;

            // 创建数据报
            DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, serverAddress, serverPort);

            // 发送数据报
            clientSocket.send(sendPacket);

            // 关闭UDP套接字
            clientSocket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

这个示例中,UDP服务器不断接收来自客户端的消息,并将其打印出来。客户端发送一条消息到服务器。

4. 总结

本文介绍了Java中如何使用UDP协议进行网络通信,包括UDP的基础知识、UDP编程的基本步骤、创建UDP套接字、发送和接收UDP数据等内容。UDP适用于对数据传输的实时性要求较高的场景,但需要注意数据的不可靠性和无连接性。通过学习本文,您可以开始使用UDP协议来构建自己的网络应用程序。


http://www.niftyadmin.cn/n/5040793.html

相关文章

抖音短视频矩阵系统搭建

企业在进行短视频矩阵运营时,搭建一个矩阵号是非常必要的。矩阵号可以绑定多个不同平台的账号,批量制作和定时发布短视频,提高企业的曝光量和粉丝互动。但是,如何搭建一个有效的短视频矩阵号呢?以下是几个关键步骤。 一…

谷歌浏览器关闭自动更新功能

背景:自动化测试需要下载webdriver驱动,然而浏览器自动更新会导致原来的驱动版本与现有浏览器版本不匹配,所以要禁用掉浏览器自动更新功能。 1.右键-我的电脑-打开管理; 2.选择任务计划程序-任务计划程序库-找到两个chrome自动更新…

【JAVA】关于抽象类的概念

个人主页:【😊个人主页】 系列专栏:【❤️初识JAVA】 前言 在Java中,抽象类是一种特殊的类,它无法被实例化。它只能被用作其他类的基类,以便子类可以继承它的属性和方法。今天我们就来谈谈JAVA中的抽象类。…

使用QLoRA对Llama 2进行微调的详细笔记

使用QLoRA对Llama 2进行微调是我们常用的一个方法,但是在微调时会遇到各种各样的问题,所以在本文中,将尝试以详细注释的方式给出一些常见问题的答案。这些问题是特定于代码的,大多数注释都是针对所涉及的开源库以及所使用的方法和…

基于微信小程序的实验室预约管理系统设计与实现

前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 👇🏻…

【MYSQL】5.7版本出错 this is incompatible with sql_mode=only_full_group_by

错误: which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_modeonly_full_group_by 解决一: 执行以下代码,把5.7的mode是STRICT_TRANS_TABLES改成NO_ENGINE_SUBSTITUTION,也就…

Selenium Grid 的搭建方法

传统 Selenium Grid 的搭建方法 搭建一个具有 1 个 Node 的 Selenium Grid。那么通常来讲我们需要 2 台机器,其中一台作为 Hub,另外一台作为 Node,并要求这两台机器已经具备了 Java 执行环境。 1.通过官网下载 selenium-server-standalone-…

Python Opencv实践 - 人脸识别CascadeClassifier

参考资料: 【PythonOpenCV 人脸检测—CascadeClassifier 级联分类器实现】_LPY。的博客-CSDN博客 ‘cv::CascadeClassifier::detectMultiScale‘_只要思想不滑坡办法总比困难多--小鱼干的博客-CSDN博客 import cv2 as cv import matplotlib.pyplot as plt import nu…