Java实现UDP通信

news2024/9/24 7:25:08

文章目录

    • UDP 通信的基本概念
    • Java 中的 UDP 编程
    • 入门例子
    • 实时通信和多发多收

UDP 通信的基本概念

  • 无连接:UDP是一种无连接协议,发送数据之前不需要建立连接。
  • 不可靠:UDP不保证数据包的可靠传输,数据包可能会丢失。
  • 轻量级:由于不需要维护连接状态,UDP比TCP更轻量级。
  • 广播和多播:UDP支持广播和多播,适合于需要向多个接收者发送消息的应用场景。

UDP 是无连接的,所以我们不需要先建立连接,只需要指定 IP 和端口号。

Java 中的 UDP 编程

Java 通过 DatagramSocketDatagramPacket 类可以实现 UDP 通信:

  1. 发送消息:使用 DatagramSocket 来创建一个用于发送数据的 UDP 套接字。通过 DatagramPacket 将要发送的数据、目标 IP 地址和端口号封装成数据报,然后使用 send 方法发送数据。

  2. 接收消息:同样使用 DatagramSocket 来创建一个 UDP 套接字,但需要绑定到一个特定的端口,用于监听传入的数据报。利用 DatagramPacket 创建一个数据包作为接收缓冲区,然后调用 receive 方法接收数据。

  3. 区别:发送方不需要指定端口,可以使用任意可用端口发送数据。而接收方则必须绑定到一个特定的端口,以便监听和接收数据报。

入门例子

发送端

public class UdpClient {
    public static void main(String[] args) throws Exception {
        // 创建一个 UDP 套接字
        DatagramSocket socket = new DatagramSocket();

        // 要发送的数据
        byte[] data = "hello".getBytes();

        // 创建一个数据包,包含数据、数据长度、目标 IP 地址和端口号
        DatagramPacket packet = new DatagramPacket(
                data,                           
                data.length,                   
                InetAddress.getByName("127.0.0.1"),  
                10010              
        );

        // 发送数据包
        socket.send(packet);
        System.out.println("消息已发送~~~");

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

接收方

public class UdpServer {
    public static void main(String[] args) throws Exception {
        System.out.println("服务端启动~~~");

        // 创建一个 UDP 套接字,并绑定到指定端口(10010)
        DatagramSocket socket = new DatagramSocket(10010);

        // 用于接收数据的字节数组
        byte[] buffer = new byte[1024];

        // 创建一个数据包,用于接收数据
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length);

        // 等待接收数据(阻塞调用)
        socket.receive(packet);

        // 从数据包中提取数据
        byte[] data = packet.getData();
        int length = packet.getLength();
        String receivedMessage = new String(data, 0, length); // 根据实际长度构建字符串
        System.out.println("收到数据: " + receivedMessage);
        socket.close();
    }
}

在这里插入图片描述

实时通信和多发多收

发送端

public class UdpClient {
    public static void main(String[] args) {
        // 创建一个 UDP 套接字
        try (DatagramSocket socket = new DatagramSocket();
             Scanner scanner = new Scanner(System.in)) {

            System.out.println("客户端启动,输入消息并按回车发送,输入 'exit' 退出:");

            while (true) {
                String message = scanner.nextLine();

                if ("exit".equalsIgnoreCase(message)) {
                    System.out.println("客户端退出");
                    break;
                }

                byte[] data = message.getBytes();
                // 创建数据包,包含数据、目标 IP 地址和端口号
                DatagramPacket packet = new DatagramPacket(
                        data,
                        data.length,
                        InetAddress.getByName("127.0.0.1"),
                        10010
                );
                socket.send(packet);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

接收方

public class UdpServer {
    public static void main(String[] args) {
        System.out.println("服务端启动,监听端口 10010");

        // 创建并绑定一个 UDP 套接字到端口 10010
        try (DatagramSocket socket = new DatagramSocket(10010)) {
            while (true) {
                // 用于接收数据的字节数组
                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(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) +"收到消息: " + receivedMessage);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

多发多收改一改就出来了


注意:UDP通信的形式

  • 单播:单台主机与单台主机之间的通信。
  • 广播:当前主机与所在网络中的所有主机通信。
  • 组播:当前主机与选定的一组主机的通信。

❤觉得有用的可以留个关注~~❤

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

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

相关文章

AI驱动下的协作经济模式可能性

人工智能 (AI) 已经变得无处不在,从我们醒来的那一刻到我们入睡的那一刻,它悄无声息地塑造着我们的日常体验。它策划我们的新闻提要,推荐我们的娱乐节目,甚至影响我们的财务决策。 随着 AI 覆盖范围的扩大&…

一、创建项目

项目中使用dotween插件; 一、建立预制体 首先创建一个空物体和一个父物体;在子物体身上挂载SpriteRenderer;父物体身上挂载代码和2D碰撞器 二、建立数据类集合(ScriptObject) 引用命名空间;创建数据类的…

基于SSM框架的客户经理信息管理系统开发与设计

基于SSM框架的客户经理信息管理系统开发与设计 嗨,我是射手座的程序媛,期待和大家更多的交流与学习,欢迎添加3512724768。 1.软件开发流程 软件的开发流程包括:问题的定义及规划、需求分析、软件设计、程序编码、软件测试五个阶…

网络优化2|最小生成树|Kruskal|Prim|Matlab

最小生成树问题 树 连通图 G ( V , E ) G(V,E) G(V,E),若G中不含任何回路,则称G为树。 ∣ V ∣ 1 |V |1 ∣V∣1时称之为平凡树 生成树 G ( V , E ) G(V,E) G(V,E),若G的一个生成子图是一棵树,则称之为G的一棵生成树&#…

Redis中的缓存穿透、缓存击穿、缓存雪崩(面试版)

缓存穿透 缓存穿透:查询一个不存在的数据,在mysql数据库中查询不到数据也不会写入缓存,导致每次请求都查询数据库,增加数据库负载。 解决办法: 1、缓存空值:将数据库中不存在的结果(例如空值)也缓存起来&#xff0c…

链式二叉树(C语言数据结构)

前言: 前期学习二叉树,包括堆,都是利用数组实现。 接下来就用链表的形式实现二叉树,并实现二叉树的相关功能。 二叉树前序遍历: 什么是前序遍历,任何一棵二叉树都可以分为根和左子树、右子树。 例如&…

【黑马点评】优惠券秒杀(单体模式)

优惠券秒杀业务流程 一人一单:要保证一个用户最多只能下一单 用户提交优惠券id根据优惠券id查询优惠券信息判断秒杀是否开始或结束,如果秒杀尚未开始或已经结束就直接返回错误信息判断库存是否充足,如果库存数量小于1就直接返回错误信息根据…

火源类型检测系统源码分享 # [一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]

火源类型检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

word技巧:保护Word文档页眉,确保内容不被随意修改

我们设置了页眉内容之后,不想其他人修改自己的页眉内容,我们可以设置加密的,设置方法如下: 先将页眉设置好,退出页眉设置之后,我们选择布局功能,点击分隔符 – 连续 设置完之后页面分为上下两节…

无线领夹麦克风哪个牌子好?麦克风品牌排行榜前十名推荐

在直播与Vlog盛行的当下,一款性能卓越、稳定可靠的无线领夹麦克风无疑是内容创作者的最佳拍档。然而,市场上的无线领夹麦克风种类繁多,质量参差不齐。不少商家为追求利润最大化,采用廉价材料制造,导致收音效果差、噪音…

SqlHelper 使用EF-Core框架

public async Task AddAsync<T>(T entity) where T : class{await _context.Set<T>().AddAsync(entity);await _context.SaveChangesAsync();} //增加实体 public 表面方法是公开的&#xff0c;所有其他类都可以调用 async 表方法内可能包含异步操作&#xff0c…

快手如何去水印教程,推荐五款免费高效去水印工具

随着互联网的快速发展&#xff0c;视频内容创作和分享变得越来越普及。很多视频创作者在分享自己的作品时&#xff0c;都希望能够去除视频中的水印&#xff0c;以保护自己的版权或提高视频的观感。本文将为您介绍五款高效的视频去水印工具&#xff0c;帮助您轻松去除视频中的水…

特斯拉CEO马斯克呼吁加州加强AI监管,市场关注国际贸易动态

特斯拉与AI监管&#xff1a;马斯克的倡议 特斯拉&#xff08;TSLA&#xff09;首席执行官埃隆马斯克&#xff08;Elon Musk&#xff09;周一在社交媒体上再次表达了他对人工智能&#xff08;AI&#xff09;监管的坚定立场。他呼吁加州通过SB 1047法案&#xff0c;要求科技公司和…

前端自我提升秘籍:用这个工具快速成为全栈开发者!

最近&#xff0c;有不少前端开发者都在讨论如何进一步提升自己的技能&#xff0c;尤其是那些一直在公司里负责后台管理系统的同学。毕竟&#xff0c;后台管理系统虽然重要&#xff0c;但往往功能固定、需求清晰&#xff0c;相对来说技术挑战有限。要想突破自己的技术瓶颈&#…

黑神话悟空配置要求_2024年黑神话悟空游戏电脑配置推荐

《黑神话&#xff1a;悟空》作为一款采用虚幻引擎打造的高品质游戏&#xff0c;对硬件配置有着一定的要求。包括操作系统、处理器、内存、显卡等多方面需求。有些同学一直问&#xff0c;黑神话悟空配置要求是什么&#xff1f;下面小编就针对这个问题给大家介绍黑神话悟空官方配…

查找算法刷题【二分查找算法】

一、原理 如下图所示的就是二分查找算法的原理&#xff1a; 注意&#xff1a;二分查找算法中一个重要的思想&#xff1a;数组和函数是一样的概念&#xff0c;对可以使用二分法查找要求如下所示。 &#xff08;1&#xff09;数组f[i]是有序数组 &#xff08;2&#xff…

mapstruct和lombok同时使用时,转换实体类时数据丢失

全局搜一下maps&#xff0c;找到你进行转换的方法 可以看到新建了TswCaseInfoPlus后直接返回了&#xff0c;说明TswCaseInfoPlus没有set方法&#xff0c;或者说编译后lombok没生效 在pom文件中&#xff0c;编译打包插件中将lombok&#xff0c;mapstruct&#xff0c;lombok-map…

武汉流星汇聚:未来已来,亚马逊多元化战略引领电商行业新纪元

在全球电商的浩瀚星空中&#xff0c;亚马逊无疑是最耀眼的明星之一。凭借其强大的品牌影响力、完善的运营体系以及不断创新的技术应用&#xff0c;亚马逊不仅在美国市场稳坐头把交椅&#xff0c;更在全球范围内不断拓展其业务版图。展望未来&#xff0c;亚马逊的未来发展前景依…

新生开学,需要带的东西有哪些!

每年开学季&#xff0c;先给学子们来个灵魂拷问&#xff1a;你们是否已经做好了迎接新挑战的准备&#xff0c;还是在迷茫中踏入新的征程&#xff1f; 不管怎样&#xff0c;我们先来解决下当下寄件问题。上大学要带啥&#xff1f;行李怎么寄便宜&#xff1f; 寄快递注意事项 …

[论文笔记] LLM-ICL论文:AI模型对prompt格式分隔符的敏感性——结构化Prompt格式

又见惊雷&#xff0c;结构化Prompt格式小小变化竟能让LLM性能波动高达76%&#xff0c;ICLR2024