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

2023-09-21 23:16:59

在这里插入图片描述

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套接字,用于发送和接收数据报。

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

2.2. 发送UDP数据

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

// 创建要发送的数据
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类来创建一个用于接收数据报的缓冲区,并接收来自指定端口的数据。

// 创建接收数据的缓冲区
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套接字以释放资源。

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

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

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

UDP服务器端代码:

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客户端代码:

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协议来构建自己的网络应用程序。

更多推荐

《红警3》因计算机中丢失d3dx9_35.dll无法打开游戏怎么办?最新解决方法推荐

d3dx9_35.dll是DirectX9.0c的一部分,它是一个动态链接库(DLL),包含了许多用于支持DirectX9.0c功能的函数和类。DirectX是一种由微软开发的游戏和多媒体应用程序编程接口,它提供了许多功能,如3D图形、音频、输入等,以便开发人员能够更轻松地创建高质量的游戏和多媒体应用程序。1、d3dx

lambda

一个lambda表达式表示一个可调用的代码单元。可以将其理解为一个未命名的内联函数。与普通函数类似,一个lambda具有一个返回类型、一个参数列表和一个函数体。与普通函数不同的是,lambda可以定义在其他函数内部。一个lambda表达式具有如下形式:[capturelist](parameterlist)->retu

骨髓小游戏

欢迎来到程序小院骨髓玩法:骨髓推塔小游戏,敌方士兵进入到我方高塔会毁坏建筑,我方可派兵前去迎战,我方:骑兵、长枪兵、弓兵、敌法:骷髅骑兵、骷髅长枪兵、骷髅弓兵,快去消灭敌人吧^^。开始游戏https://www.ormcc.com/play/gameStart/184html<divid="game"></div>cs

【EI会议】第三届大数据、人工智能与风险管理国际学术会议 (ICBAR 2023)

第三届大数据、人工智能与风险管理国际学术会议(ICBAR2023)20233rdInternationalConferenceonBigData,ArtificialIntelligenceandRiskManagement第三届大数据、人工智能与风险管理国际学术会议(ICBAR2023)将于2023年11月24-26

华为云云服务器评测 [Vue3 博物馆管理系统] 使用Vue3、Element-plus菜单组件构建轮播图

系列文章目录华为云云服务器评测第一章[linux实战]华为云耀云服务器L实例Java、node环境配置华为云云服务器评测第二章[linux实战]Unbutnu添加SSHKey、启动Springboot项目华为云云服务器评测第三章[linux实战]使用Vue3、Element-plus菜单组件构建轮播图华为云云服务器评测

Windows10怎么清除运行框中历史记录?电脑中怎么清除活动历史记录?

Windows10怎么清除运行框中历史记录?电脑中怎么清除活动历史记录?Win10怎么清除运行框中历史记录?那小编就来给大家解答一下吧,希望可以帮助到大家吧。清除运行框中历史记录1、在Win10系统下,按住键盘的“Win+R”快捷组合键,打开“运行”对话狂。2、在打开的“运行”对话框中,输入“regedit”命令,然后

计算机IO原理

一、中断机制在IO处理中有2种思路,一种就是轮训(polling)机制,一种是中断(interrupt)机制,前置是一种同步的通信机制,不是计算机中IO采用的机制,我们重点来说明中断机制。CPU停下当前的工作任务,去处理其他事情,处理完后回来继续执行刚才的任务,这一过程便是中断。中断分为外部中断和内部中断。外部中断可屏

移动 Web 第一天

目标:使用位移、缩放、旋转、渐变效果丰富网页元素的呈现方式。文章目录01-平面转换简介平移定位居中案例-双开门旋转转换原点案例-时钟多重转换缩放案例-播放特效倾斜02-渐变线性渐变案例-产品展示径向渐变03-综合案例导航-频道箭头旋转频道列表渐变按钮搜索按钮登录按钮客户端按钮轮播图猜你喜欢01-平面转换简介作用:为元素

精益求精:Android应用体积优化的终极指南

精益求精:Android应用体积优化的终极指南1.介绍在当今移动应用生态系统中,Android应用的体积优化是开发者需要高度重视的关键方面之一。一个庞大的应用体积不仅会对用户体验造成负面影响,还会导致以下问题:下载速度延迟:用户需要等待更长时间来下载和安装应用程序,这可能导致用户流失。占用存储空间:较大的应用占用用户设

华为开源自研AI框架昇思MindSpore应用案例:消噪的Diffusion扩散模型

目录一、环境准备1.进入ModelArts官网2.使用CodeLab体验Notebook实例二、案例实现构建Diffusion模型位置向量ResNet/ConvNeXT块Attention模块组归一化条件U-Net正向扩散数据准备与处理采样训练过程推理过程(从模型中采样)本文基于HuggingFace:TheAnnot

Homebrew国内和国外如何自动安装(Mac & Linux)

介绍Homebrew是一个适用于macOS和Linux操作系统的开源包管理器,它允许用户轻松安装、升级和管理各种软件包和工具。Homebrew的目标是简化软件包的安装和维护过程,使用户能够快速获取他们所需的工具和应用程序。安装1、官网推荐安装方式,如果在国内,要使用vpn才可以访问通在macOS上安装Homebrew:

热文推荐