Java网络编程----UDP实现单播,组播,广播

news2024/9/9 1:03:15

文章开头,先来回忆一下

什么是UDP?

UDP 的全称是 User Datagram Protocol,用户数据报协议。它不需要所谓的握手操作,从而加快了通信速度,允许网络上的其他主机在接收方同意通信之前进行数据传输。

UDP 的特点主要有?

UDP 能够支持容忍数据包丢失的带宽密集型应用程序

UDP 具有低延迟的特点 UDP 能够发送大量的数据包

UDP 能够允许 DNS 查找,DNS 是建立在 UDP 之上的应用层协议。

那不得不说一下

什么是TCP?

TCP 的全称是Transmission Control Protocol ,传输控制协议。它能够帮助你确定计算机连接到 Internet 以及它们之间的数据传输。通过三次握手来建立 TCP 连接,三次握手就是用来启动和确认 TCP 连接的过程。一旦连接建立后,就可以发送数据了,当数据传输完成后,会通过关闭虚拟电路来断开连接。

TCP 的主要特点有?

TCP 能够确保连接的建立和数据包的发送

TCP 支持错误重传机制 TCP 支持拥塞控制,能够在网络拥堵的情况下延迟发送 TCP

能够提供错误校验和,甄别有害的数据包。

UDP 和 TCP 的区别?

TCP 是面向连接的协议 。 UDP 是无连接的协议

TCP 在发送数据前先需要建立连接,然后再发送数据 。 UDP 无需建立连接就可以直接发送大量数据

TCP 会按照特定顺序重新排列数据包 。 UDP 数据包没有固定顺序,所有数据包都相互独立

TCP 传输的速度比较慢 。 UDP 的传输会更快 TCP 的头部字节有 20 字节 。 UDP 的头部字节只需要 8 个字节

TCP 是重量级的,在发送任何用户数据之前,TCP需要三次握手建立连接。 UDP 是轻量级的。没有跟踪连接,消息排序等。 

TCP 会进行错误校验,并能够进行错误恢复 。 UDP 也会错误检查,但会丢弃错误的数据包

TCP 有发送确认。 UDP 没有发送确认

TCP 会使用握手协议,例如 SYN,SYN-ACK,ACK。 UDP无握手协议

TCP 是可靠的,因为它可以确保将数据传送到路由器。 UDP 中不能保证将数据传送到目标

 

UDP发送数据

接下进入正题,使用Java语言实现UDP发送数据与接收数据。

1.单播

单播的发送端具体流程

1.准备我们的数据源,如字符串数据,需要将其转为byte数组

2.准备你要传输的ip地址以及端口号

3.使用DatagramPacket进行将以上数据进行包装

4.通过DatagramSocket来发送我们的DatagramPacket

单播的接收端具体流程

1.准备好接收数组,用于接收数据缓冲

2.准备DatagramSocket,需要传入端口号,表示别人将从该端口进行发送数据

3.使用DatagramSocket进行数据接收,结果将返回在DatagramPacket对象中

4.调用DatagramPacket对象方法进行数据处理

发送:

package com.wxy.inetPackage;

import java.io.IOException;
import java.net.*;

public class DatagramSend {
    public static void main(String[] args) throws IOException {
        DatagramSocket datagramSocket = new DatagramSocket();
        String str = "你好啊我是你的好朋友来自UDP";
        byte[] bytes = str.getBytes();
        InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
        int port = 10086;
        DatagramPacket datagramPacket = new DatagramPacket(bytes,bytes.length,inetAddress,port);

        datagramSocket.send(datagramPacket);
        datagramSocket.close();


    }
}

接收:

package com.wxy.inetPackage;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class DatagramReceive {
    public static void main(String[] args) throws IOException {
        DatagramSocket datagramSocket = new DatagramSocket(10086);
        byte[] bytes = new byte[1024];
        DatagramPacket datagramPacket = new DatagramPacket(bytes,bytes.length);
        datagramSocket.receive(datagramPacket);

        //解析数据
        byte[] data = datagramPacket.getData();
        int length = datagramPacket.getLength();
        InetAddress address = datagramPacket.getAddress();
        int port = datagramPacket.getPort();
        System.out.println("当前收到数据是:" + new String(data,0,length) + ",长度为" + length + ",发送端的地址是" + address + ",端口号是" + port);

        datagramSocket.close();
    }
}

2.组播

这里需要用到一个新的Socket,叫做MulticastSocket,使用它用来发送与接收我们的组播数据。其次需要注意的是,组播最好使用预留的224.0.0.0-224.0.0.255,其它与单播大致相同。

发送

package com.wxy.inetPackage;

import com.wxy.shiyanwu.User;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;

public class MulticastSend {
    public static void main(String[] args) throws IOException {
        MulticastSocket multicastSocket = new MulticastSocket();
        InetAddress inetAddress = InetAddress.getByName("224.0.0.1");
        String msg = "你好这里来自组播--";
        byte[] bytes = msg.getBytes();
        int port = 10000;
        DatagramPacket datagramPacket = new DatagramPacket(bytes,bytes.length,inetAddress,port);
        multicastSocket.send(datagramPacket);
        multicastSocket.close();
    }
}

接收

package com.wxy.inetPackage;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;

public class MultiRec {
    public static void main(String[] args) {

        for (int i = 0;i < 3;i ++) {
            new Thread(()->{

                try (MulticastSocket multicastSocket = new MulticastSocket(10000);){
                    InetAddress inetAddress = InetAddress.getByName("224.0.0.1");
                    multicastSocket.joinGroup(inetAddress);
                    byte[] bytes = new byte[1024];
                    DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
                    multicastSocket.receive(datagramPacket);
                    byte[] data = datagramPacket.getData();
                    System.out.println(Thread.currentThread().getName() + "收到数据:" + new String(data,0,datagramPacket.getLength()) + "hello");
                }catch (IOException e){
                    e.printStackTrace();
                }
            }).start();
        }
    }
}

3.广播

广播更为简单,只需要将单播发送的ip改为广播IP即可,即255.255.255.255,接收就不上代码了,使用广播发送所有局域网上的IP都能接收得到,所以直接使用上方提供的单播接收也是可以接收到的。

package com.wxy.inetPackage;

import java.io.IOException;
import java.net.*;

public class DatagramSend {
    public static void main(String[] args) throws IOException {
        DatagramSocket datagramSocket = new DatagramSocket();
        String str = "你好啊我是你的好朋友来自UDP";
        byte[] bytes = str.getBytes();
        InetAddress inetAddress = InetAddress.getByName("255.255.255.255");
        int port = 10086;
        DatagramPacket datagramPacket = new DatagramPacket(bytes,bytes.length,inetAddress,port);

        datagramSocket.send(datagramPacket);
        datagramSocket.close();


    }
}

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

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

相关文章

Python 教程(七):match...case 模式匹配

目录 专栏列表前言基本语法match 语句case 语句 模式匹配的类型示例具体值匹配类型匹配序列匹配星号表达式命名变量复杂匹配 模式匹配的优势总结 专栏列表 Python教程&#xff08;一&#xff09;&#xff1a;环境搭建及PyCharm安装Python 教程&#xff08;二&#xff09;&…

智能环保气膜网球馆:大空间与防雾霾的完美结合—轻空间

在现代都市生活中&#xff0c;空气质量和空间限制成为许多体育设施的挑战。气膜技术的出现&#xff0c;为这些问题提供了卓越的解决方案。我们的智能环保气膜网球馆&#xff0c;不仅拥有宽敞的空间&#xff0c;还具备卓越的防雾霾功能&#xff0c;为体育爱好者提供了一个理想的…

牧野电火花机床联网

一、找到可选项 选择主面板中的【可选项】按钮&#xff0c;弹出来的对话框如下图所示。 二、属性设定 在左下角部分找到【属性设定】&#xff0c;如序号一所示&#xff0c;在弹出的属性设定对话框中选中【牧野EDM服务器】&#xff0c;如下图所示。 三、选则MES模式 按照上图…

苹果推送iOS 18.1带来Apple Intelligence预览

&#x1f989; AI新闻 &#x1f680; 苹果推送iOS 18.1带来Apple Intelligence预览 摘要&#xff1a;苹果向iPhone和iPad用户推送iOS 18.1和iPadOS 18.1开发者预览版Beta更新&#xff0c;带来“Apple Intelligence”预览。目前仅支持M1芯片或更高版本的设备。Apple Intellige…

Electron学习笔记(一)基础环境

目录 前言 基础环境准备 安装 Node.js 配置项目文件 通过代理服务安装 通过国内仓库安装 一些常见问题&#xff1a; 前言 一个新手学习Electron的笔记&#xff0c;记录为主&#xff0c;仅供参考。 其他文章见专栏目录。 基础环境准备 开发之前先将基础环境搭建好。 …

灯具外贸公司用什么企业邮箱好

灯具外贸公司面对海外市场的推广、产品销售、客户沟通、市场信息收集等多重需求&#xff0c;选择一个合适的企业邮箱显得尤为重要。本文将介绍灯具外贸公司为什么应选择Zoho Mail企业邮箱&#xff0c;并详细探讨其优势和功能。 一、公司背景 广东省深圳市光明新区&#xff0c…

创建 Llama-3.1-70B-Japanese-Instruct-2407 的 Ollama 模型

创建 Llama-3.1-70B-Japanese-Instruct-2407 的 Ollama 模型 1. 下载 gguf 文件2. 创建 Modelfile3. 创建 Ollama 模型4. 运行 Ollama 模型5. &#xff08;可选&#xff09;其他 Modelfile 1. 下载 gguf 文件 使用浏览器打开 https://huggingface.co/mmnga/Llama-3.1-70B-Japa…

DELL服务器RAID配置详细教程

DELL服务器RAID配置教程 在启动电脑的时候按CTRLR 进入 RAID 设置见面如下图 名称解释&#xff1a; Disk Group&#xff1a;磁盘组&#xff0c;这里相当于是阵列&#xff0c;例如配置了一个RAID5&#xff0c;就是一个磁盘组 VD(Virtual Disk)&#xff1a; 虚拟磁盘&#xff…

FFmpeg模块详解:深入理解多媒体框架的构成

&#x1f60e; 作者介绍&#xff1a;欢迎来到我的主页&#x1f448;&#xff0c;我是程序员行者孙&#xff0c;一个热爱分享技术的制能工人。计算机本硕&#xff0c;人工制能研究生。公众号&#xff1a;AI Sun&#xff08;领取大厂面经等资料&#xff09;&#xff0c;欢迎加我的…

为了人才任正非一个月蹲守人家单位门口,刘备三顾茅庐算啥!

张一鸣说&#xff1a;"一名优秀的CEO首先应该是优秀的HR&#xff01;”这句话广为流传&#xff0c;此言差矣&#xff0c;一名卓越的创始人首先应该是最卓越的猎头&#xff0c;比如任正非&#xff01; 全球的创始人也没几个人能够做像任正非那样重视人才的&#xff0c;一旦…

成为git砖家(7): posh-git的安装和使用

文章目录 1. PowerShell 里的 git 默认使用体验不够好2. posh-git 介绍2.1 安装 posh-git2.2 PS1 显示的内容2.3 补全分支 1. PowerShell 里的 git 默认使用体验不够好 在 Windows 系统上&#xff0c;安装了 git for windows 后&#xff0c; git bash 里的体验确实不错。 但是…

【云原生】kubernetes弃用docker,containerd风华正茂,何以承载云原生?

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

JAVA基础 - 泛型

目录 一. 简介 二. 集合泛型 三. 自定义泛型 四. 自定义泛型类和普通类的区别 一. 简介 泛型是 Java 语言中一种强大的特性&#xff0c;它允许在定义类、接口和方法时使用类型参数&#xff0c;从而增加了代码的类型安全性和复用性。 类型安全性&#xff1a; 使用泛型可以…

leetcode日记(60)编辑距离

感觉这题不是按难度划分的而是按代码长度划分的…看了答案才知道怎么做&#xff0c;其实思路很简单&#xff0c;但是特别难想…… 意思是使用动态规划&#xff0c;依次计算由word1的前i个字母到word2的前j个字母要经历的最小变化数。 min D[i][j]min(D[i-1][j]1,D[i][j-1]1,D…

spring 中包自动扫描之 component-scan 解析

在 spring 中&#xff0c;为简化 bean 的配置&#xff0c;在 spring-context 模块下提供了包的自动扫描功能&#xff0c;将配置的包及其子包下的所有符合条件的类都注册到 BeanFactory 中。下面来看下具体是怎么实现的。 配置 <context:component-scan base-package"…

【MIT 6.5840(6.824)学习笔记】Raft

1 脑裂 许多容错系统使用一个单主节点来决定主副本。 MapReduce&#xff1a;由单主节点控制计算复制。GFS&#xff1a;主备复制数据&#xff0c;并由单主节点确定主拷贝的位置。VMware FT&#xff1a;主虚机和备份虚机之间复制指令&#xff0c;需要单点的Test-and-Set服务确认…

[0729] X-CMD 发布 v0.4.3:借助 fzf ,提升用户使用体验

目录 X-CMD 发布 v0.4.3&#x1f50e; ll&#x1f50e; jq&#x1f50e; yq&#x1f50e; man X-CMD 发布 v0.4.3 &#x1f50e; ll 新增 --fzf 子命令 该命令借助 fzf 为用户提供了一种高效查找文件和目录的相关信息的方法&#xff0c;类似于文件管理器。 # 使用 fzf 查找文…

AI智能名片O2O商城小程序源码在社区团购中的应用与红利深度探索

摘要&#xff1a;在数字化转型的浪潮中&#xff0c;社区团购以其独特的商业模式和强大的市场渗透力&#xff0c;成为新零售领域的一股不可忽视的力量。而AI智能名片O2O商城小程序源码&#xff0c;作为技术创新的集大成者&#xff0c;正逐步渗透并深刻改变着社区团购的运作模式和…

从零开始编写一个Chrome插件:详细教程

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119@qq.com] 📱个人微信:15279484656 🌐个人导航网站:www.forff.top 💡座右铭:总有人要赢。为什么不能是我呢? 专栏导…