探索 `DatagramSocket` 类

DatagramSocket 类是 Java 网络编程中的一个关键组件,专门用于处理 UDP(用户数据报协议)通信。与基于连接的 TCP 不同,UDP 是一种无连接协议,适用于对速度和效率要求较高,但对可靠性要求相对较低的场景。

本文将详细介绍 DatagramSocket 类的基本用法、实现细节以及实际应用中的一些高级特性。

什么是 DatagramSocket 类?

DatagramSocket 类位于 Java 标准库的 java.net 包中。它提供了发送和接收数据报(datagram)的功能,这些数据报是通过 UDP 协议进行传输的。

基本用法

在使用 DatagramSocket 进行通信时,通常需要创建两个类的实例:DatagramSocketDatagramPacket。前者用于发送和接收数据报,后者用于封装发送和接收的数据。

创建 DatagramSocket 实例

要创建一个 DatagramSocket 实例,可以使用以下代码:

import java.net.DatagramSocket;
import java.net.SocketException;public class UDPSocketExample {public static void main(String[] args) {try {DatagramSocket socket = new DatagramSocket(9876);System.out.println("Socket created on port 9876");} catch (SocketException e) {e.printStackTrace();}}
}

在这个示例中,我们创建了一个绑定到端口 9876 的 DatagramSocket 对象。此端口将用于接收来自客户端的数据。

发送数据报

为了发送数据报,需要创建一个 DatagramPacket 对象,并指定目标地址和端口:

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;public class UDPSender {public static void main(String[] args) {try {DatagramSocket socket = new DatagramSocket();String message = "Hello, UDP!";byte[] buffer = message.getBytes();InetAddress address = InetAddress.getByName("localhost");DatagramPacket packet = new DatagramPacket(buffer, buffer.length, address, 9876);socket.send(packet);System.out.println("Message sent: " + message);socket.close();} catch (Exception e) {e.printStackTrace();}}
}

接收数据报

接收数据报时,需要创建一个缓冲区来存储接收到的数据:

import java.net.DatagramPacket;
import java.net.DatagramSocket;public class UDPReceiver {public static void main(String[] args) {try {DatagramSocket socket = new DatagramSocket(9876);byte[] buffer = new byte[1024];DatagramPacket packet = new DatagramPacket(buffer, buffer.length);socket.receive(packet);String receivedMessage = new String(packet.getData(), 0, packet.getLength());System.out.println("Message received: " + receivedMessage);socket.close();} catch (Exception e) {e.printStackTrace();}}
}

详细分析

构造函数

DatagramSocket 提供了多种构造函数,可以创建绑定到特定端口或 IP 地址的套接字。例如:

public DatagramSocket() throws SocketException
public DatagramSocket(int port) throws SocketException
public DatagramSocket(int port, InetAddress laddr) throws SocketException

发送和接收方法

  • send(DatagramPacket p):发送数据报包。
  • receive(DatagramPacket p):接收数据报包。该方法是阻塞的,会等待直到接收到数据报包。

关闭套接字

使用完 DatagramSocket 后,应该调用 close() 方法释放资源:

socket.close();

高级特性

设置超时

可以通过 setSoTimeout() 方法为 DatagramSocket 设置超时时间:

socket.setSoTimeout(5000); // 设置超时时间为 5000 毫秒

广播

UDP 允许广播消息到一个网络上的所有设备。可以通过设置数据包的目标地址为广播地址来实现:

InetAddress broadcastAddress = InetAddress.getByName("255.255.255.255");
DatagramPacket packet = new DatagramPacket(buffer, buffer.length, broadcastAddress, 9876);
socket.send(packet);

多播

多播是一种特殊的广播,允许将数据发送到特定组的多个主机。Java 提供了 MulticastSocket 类来支持多播。

实际应用示例

下面是一个简单的聊天应用,通过 UDP 实现:

发送端

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;public class UDPChatSender {public static void main(String[] args) {try {DatagramSocket socket = new DatagramSocket();InetAddress address = InetAddress.getByName("localhost");Scanner scanner = new Scanner(System.in);while (true) {System.out.print("Enter message: ");String message = scanner.nextLine();byte[] buffer = message.getBytes();DatagramPacket packet = new DatagramPacket(buffer, buffer.length, address, 9876);socket.send(packet);if ("exit".equalsIgnoreCase(message)) {break;}}socket.close();scanner.close();} catch (Exception e) {e.printStackTrace();}}
}

接收端

import java.net.DatagramPacket;
import java.net.DatagramSocket;public class UDPChatReceiver {public static void main(String[] args) {try {DatagramSocket socket = new DatagramSocket(9876);byte[] buffer = new byte[1024];while (true) {DatagramPacket packet = new DatagramPacket(buffer, buffer.length);socket.receive(packet);String receivedMessage = new String(packet.getData(), 0, packet.getLength());System.out.println("Received: " + receivedMessage);if ("exit".equalsIgnoreCase(receivedMessage)) {break;}}socket.close();} catch (Exception e) {e.printStackTrace();}}
}

总结

DatagramSocket 类是 Java 网络编程中处理 UDP 通信的核心工具。通过掌握其基本用法和高级特性,可以构建高效、可靠的 UDP 应用。

希望这篇文章能帮助你更好地理解和使用 DatagramSocket 类。如果你有任何问题或想法,欢迎在评论区分享!

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

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

相关文章

【JavaScript】包装类

包装类 JS 提供了三个主要的包装类:String、Number、Boolean。如果尝试把原始类型(string、number、boolean)数据当成对象使用,JS 会自动将其转换为对应包装类的实例。 我们先来看一下 “基本类型数据” 及 “其包装类的实例” …

个人倒计时页面源码,实用倒计时单页源码

一、源码描述 这是一款非常实用的个人倒计时页面,支持设置未来一年时间,支持设置背景音乐,支持自定义下拉页面,点击向下箭头查看。 二、源码截图 三、源码下载

docker 常用命令,后面不断更新

1.从Docker容器中下载文件到本地的方法 使用 docker cp 命令:该命令可以将文件或目录从容器复制到主机。该方法简单快捷,适用于少量文件的下载。 # 将容器名为my_container中的 /data/file.txt文件复制到本地/path/to/save/file.txt docker cp my_container:/data/…

深入探讨【C++容器适配器】:现代编程中的【Stack与Queue】的实现

目录 一、Stack(栈) 1.1 Stack的介绍 1.2 Stack的使用 1.3 Stack的模拟实现 二、Queue(队列) 2.1 Queue的介绍 2.2 Queue的使用 2.3 Queue的模拟实现 三、容器适配器 3.1 什么是适配器 3.2 为什么选择deque作为stack和…

kylin入门教程

Apache Kylin的入门教程主要涵盖以下几个方面: 一、Apache Kylin简介 Apache Kylin是一个开源的分布式分析引擎,提供Hadoop之上的SQL接口及多维分析(OLAP)能力以支持超大规模数据。最初由eBay Inc.开发并贡献至开源社区&#xf…

基于Vue和UCharts的前端组件化开发:实现高效、可维护的词云图与进度条组件

基于Vue和UCharts的前端组件化开发:实现高效、可维护的词云图与进度条组件 摘要 随着前端技术的迅速发展和业务场景的日益复杂,传统的整块应用开发方式已无法满足现代开发的需求。组件化开发作为一种有效的解决方案,能够将系统拆分为独立、…

Shell基础之函数和数组

目录 函数 什么是函数 函数的语法 函数的调用 函数的返回值 函数的案例 函数变量的作用域 递归函数 函数库文件 数组 定义数组语法 数组操作 获取所有元素 获取元素下标 获取数组长度 获取数组元素 数组添加元素 删除数组元素 删除数组 遍历数组元素 数组案…

解决pycharm无法识别miniconda

解决pycharm无法识别miniconda 找到miniconda安装目录下condabin/conda.bat文件,点击load即可识别codna环境 a环境

Spring Boot(七十九):SprngBoot整合Apache tika做文件类型检测

之前有一个章节介绍了Apache tika实现文档内容解析,地址如下:Spring Boot(六十八):SpringBoot 整合Apache tika 实现文档内容解析_springboot tika pptx-CSDN博客 下面我们介绍Apache tika实现文件类型检测 1 引入依赖 <dependency><groupId>org.apache.tika&…

Docker 挂载目录空间占满修改/var/lib/docker/overlay2 的路径解决方案

本文详细描述了在CentOS7系统中卸载旧版Docker、安装依赖、添加Docker源、配置存储路径并启动Docker&#xff0c;使其在/home目录下运行的过程。 以下是在CentOS 7下重新安装Docker并将其安装在/home/下的完整步骤&#xff1a; 卸载旧版本的Docker。如果您之前已经安装了Dock…

仕考网:没有学位证能考公务员吗?

公务员考试需要满足报名条件才能参加&#xff0c;没有学位证能考公吗? 没有学位证书的考生也有机会参与公务员考试虽然可以选择的岗位比较少&#xff0c;但可以报考参加那些不设定学位要求的岗位。当发布的公务员招录信息中某一职位的学位要求标注为“无要求”时&#xff0c;…

【C++】:继承[下篇](友元静态成员菱形继承菱形虚拟继承)

目录 一&#xff0c;继承与友元二&#xff0c;继承与静态成员三&#xff0c;复杂的菱形继承及菱形虚拟继承四&#xff0c;继承的总结和反思 点击跳转上一篇文章&#xff1a; 【C】&#xff1a;继承(定义&&赋值兼容转换&&作用域&&派生类的默认成员函数…

MATLAB Gazebo联合仿真

准备仿真环境&#xff1a;在Gazebo中设置仿真场景&#xff0c;包括机器人模型、环境布局、传感器和执行器等。编写MATLAB脚本&#xff1a;在MATLAB中编写控制算法和数据处理脚本&#xff0c;用于接收Gazebo中的传感器数据&#xff0c;并生成控制命令。建立通信&#xff1a;通过…

DEBUG:jeston卡 远程ssh编程

问题 jeston 打开网页 gpt都不方便 而且只需要敲命令就行 解决 下载MobaXterm(window执行) liunx需要虚拟机 软件 远程快速复制命令

PHP文字ocr识别接口示例、人工智能的发展

全球在人工智能升级的大背景下&#xff0c;有一定规模的制造商开始大量部署人工智能机器人、系统&#xff0c;以此取代危险、简单和重复性的工作。各种人工智能技术的迅猛发展&#xff0c;正在驱动各行业就业市场发现变革。 京东物流大家并不陌生&#xff0c;京东快递机器人在…

vue中table内容和lable对不齐解决方案

问题&#xff1a; 代码片段&#xff1a; <template><el-table :data"tableData" stripe style"width: 100%"><el-table-column prop"title" label"标题" width"80px" /><el-table-column prop"n…

Windows安全日志导致环境内存占用过高

Windows 环境内存占用高不释放&#xff0c;目前遇到的常见情况如下&#xff1a; 情况一&#xff1a;JVM内存泄漏 这种网上的排查方式有很多&#xff0c;自行查阅即可 情况二&#xff1a;SQLserver内存配置过大 这种也是&#xff0c;从网上查找修改方式然后修改即可 情况三…

python的面向对象编程

为什么要面向对象编程&#xff1f; 伟大的领袖毛泽东曾说过&#xff1a;编程最大的敌人是重复。 最开始&#xff0c;在程序中写的一条条语句&#xff0c;在执行的时候会变成一条条指令交给CPU执行。这就是**“程序是指令的集合”** 。为了简化程序的设计&#xff0c;引入了函数…

WebPages 全局:深入解析现代网页设计与开发

WebPages 全局:深入解析现代网页设计与开发 引言 随着互联网技术的飞速发展,网页设计与开发已经成为了数字化时代的重要组成部分。从简单的文本和图像展示,到如今复杂的多媒体交互体验,网页设计经历了翻天覆地的变化。本文将深入探讨WebPages全局,包括网页设计的基本概念…

Defensor 4.5:构建数据资产为中心的安全运营体系

5月31日“向星力”未来数据技术峰会上&#xff0c;星环科技重磅发布数据安全管理平台 Defensor 4.5版本。新版本引入了以数据资产为中心的数据安全运营体系&#xff0c;通过智能化大模型技术&#xff0c;帮助企业快速、精准地识别核心重要资产&#xff1b;建设全局的数据安全策…