Java的UDP通信

embedded/2024/12/22 15:48:50/

Java的UDP通信

UDP发送数据

  • Java中的UDP通信

    • UDP协议是一种不可靠的网络协议,它在通信的两端各建立一个Socket对象,但是这两个Socket只是发送,接收数据的对象,因此对于基于UDP协议的通信双方而言,没有所谓的客户端和服务器的概念
    • Java提供了DatagramSocket类作为基于UDP协议的Socket
  • 构造方法

    方法名说明
    DatagramSocket()创建数据报套接字并将其绑定到本机地址上的任何可用端口
    DatagramPacket(byte[] buf,int len,InetAddress add,int port)创建数据包,发送长度为len的数据包到指定主机的指定端口
  • 相关方法

    方法名说明
    void send(DatagramPacket p)发送数据报包
    void close()关闭数据报套接字
    void receive(DatagramPacket p)从此套接字接受数据报包
  • 发送数据的步骤,我们也可以把发送数据的步骤理解为给自己心爱的女神发送快递的全过程

    • 寻找快递公司(创建发送端的Socket对象(DatagramSocket))
    • 打包快递(创建数据,并把数据打包)
    • 快递发货(调用DatagramSocket对象的方法发送数据)
    • 付钱走人(关闭发送端)
  • 代码演示

    java">package net;import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.util.Scanner;public class SendMessageDemo1 {public static void main(String[] args) throws IOException {//1.创建DatagramSocket对象(快递公司)//细节//绑定端口:以后我们就是通过这个端口发送数据//有参:指定端口号进行绑定//无参:在所有可用端口中随机绑定一个端口DatagramSocket ds = new DatagramSocket();//2.打包快递,打包数据Scanner sc = new Scanner(System.in);while (true) {System.out.println("请输入要发送的数据:");String str = sc.nextLine();if ("000".equals(str)) {break;}byte[] bytes = str.getBytes();InetAddress address = InetAddress.getByName("127.0.0.1");int port = 10086;DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);//3.快递发货,发送数据ds.send(dp);}//4.付钱走人,释放资源ds.close();}
    }
    

UDP接收数据

  • 接收数据的步骤可以理解为女神收到我们快递的过程

    • 找到快递驿站(创建接收端的Socket对象(DatagramSocket))
    • 找到快递(创建一个数据包,用于接收数据)
    • 签收快递(调用DatagramSocket对象的方法接收数据)
    • 拆开快递(解析数据包,并把数据在控制台显示)
    • 最后发现我们送到礼物女神不喜欢,把我们拉黑(关闭接收端)
  • 构造方法

    方法名说明
    DatagramPacket(byte[] buf, int len)创建一个DatagramPacket用于接收长度为len的数据包
  • 相关方法

    方法名说明
    byte[] getData()返回数据缓冲区
    int getLength()返回要发送的数据的长度或接收的数据的长度
  • 示例代码

    java">package net;import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;public class ReceiveMessageDemo1 {public static void main(String[] args) throws Exception {//1.创建DatagramSocket对象(快递公司)//细节://在接收的时候,一定要绑定端口//而且绑定的端口一定要跟发送的端口保持一致DatagramSocket ds = new DatagramSocket(10086);//2.接受数据包byte[] bytes = new byte[1024];DatagramPacket dp = new DatagramPacket(bytes, bytes.length);while (true) {//该方法是阻塞的//程序执行到这一步的时候,会在这里一直等//等发送端发送消息ds.receive(dp);//3.解析数据包byte[] data = dp.getData();InetAddress address = dp.getAddress();int length = dp.getLength();System.out.println("接收到数据" + new String(data, 0, length));System.out.println("来自" + address + ":" + dp.getPort());}}
    }

UDP三种通讯方式

  • 单播

单播用于两个主机之间的端对端通信,使用DatagramSocket简易版数据的发送与接收就是单播

  • 组播

    组播用于对一组特定的主机进行通信

    组播地址:224.0.0.0-239.255.255.255

    其中224.0.0.0-224.0.0.255为预留的组播地址

  • 广播

    广播用于一个主机对整个局域网上所有主机上的数据通信

    组播地址:255.255.255.255

UDP组播实现

  • 实现步骤

    • 发送端
      1. 创建发送端的Socket对象(DatagramSocket)
      2. 创建数据,并把数据打包(DatagramPacket)
      3. 调用DatagramSocket对象的方法发送数据(在单播中,这里是发给指定IP的电脑但是在组播当中,这里是发给组播地址)
      4. 释放资源
    • 接收端
      1. 创建接收端Socket对象(MulticastSocket)
      2. 创建一个箱子,用于接收数据
      3. 把当前计算机绑定一个组播地址
      4. 将数据接收到箱子中
      5. 解析数据包,并打印数据
      6. 释放资源
  • 代码实现

java">import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;public class SendMessageDemo1 {public static void main(String[] args) throws Exception {/*** 组播发送代码*///1.创建MulticastSocket对象MulticastSocket ms = new MulticastSocket();//2.创建数据包,封装要发送的数据byte[] bytes = "你好帅".getBytes();InetAddress address = InetAddress.getByName("224.0.0.3");int port = 10086;//3.发送数据ms.send(new DatagramPacket(bytes, bytes.length, address, port));//4.释放资源ms.close();}
}
java">import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;public class ReceiveMessageDemo1 {public static void main(String[] args) throws Exception {/*** 组播接受代码*///1.创建MulticastSocket对象MulticastSocket ms = new MulticastSocket(10086);//2.将当前本机添加到指定的组播地址224.0.0.3中InetAddress address = InetAddress.getByName("224.0.0.3");ms.joinGroup(address);//3.创建DatagramPacket对象,用于接收数据byte bytes[] = new byte[1024];DatagramPacket dp = new DatagramPacket(bytes, bytes.length);//4.接收数据ms.receive(dp);//5.解析数据byte[] data = dp.getData();int len = dp.getLength();InetAddress ip = dp.getAddress();String name = dp.getAddress().getHostName();System.out.println("来自" + name + ":" + ip + ":" + new String(data, 0, len));//6.释放资源ms.close();}
}

UDP广播实现

  • 实现步骤

    • 发送端
      1. 创建发送端Socket对象(DatagramSocket)
      2. 创建存储数据的箱子,将广播地址封装进去
      3. 发送数据
      4. 释放资源
    • 接收端
      1. 创建接收端的Socket对象(DatagramSocket)
      2. 创建一个数据包,用于接收数据
      3. 调用DatagramSocket对象的方法接收数据
      4. 解析数据包,并把数据在控制台显示
      5. 关闭接收端
  • 代码实现

java">import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;public class SendMessageDemo1 {public static void main(String[] args) throws Exception {/*** 广播发送代码*///1.创建MulticastSocket对象MulticastSocket ms = new MulticastSocket();//2.创建数据包,封装要发送的数据byte[] bytes = "你好帅".getBytes();InetAddress address = InetAddress.getByName("255.255.255.255");int port = 10086;//3.发送数据ms.send(new DatagramPacket(bytes, bytes.length, address, port));//4.释放资源ms.close();}
}
java">import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;public class ReceiveMessageDemo1 {public static void main(String[] args) throws Exception {/*** 广播接受代码*///1.创建MulticastSocket对象MulticastSocket ms = new MulticastSocket(10086);//2.将当前本机添加到指定的组播地址224.0.0.3中InetAddress address = InetAddress.getByName("224.0.0.3");ms.joinGroup(address);//3.创建DatagramPacket对象,用于接收数据byte bytes[] = new byte[1024];DatagramPacket dp = new DatagramPacket(bytes, bytes.length);//4.接收数据ms.receive(dp);//5.解析数据byte[] data = dp.getData();int len = dp.getLength();InetAddress ip = dp.getAddress();String name = dp.getAddress().getHostName();System.out.println("来自" + name + ":" + ip + ":" + new String(data, 0, len));//6.释放资源ms.close();}
}

http://www.ppmy.cn/embedded/126003.html

相关文章

Bash脚本中的列表(数组)和字典类型

在Bash脚本中,没有像高级编程语言(如Python、Perl或Ruby)那样的内置列表(数组)或字典(关联数组/哈希表)的严格概念,但Bash确实提供了对这两种数据结构的支持,尽管功能相对…

【浏览器】如何正确使用Microsoft Edge

1、清理主页广告 如今的Microsoft Edge 浏览器 主页太乱了,各种广告推送,点右上角⚙️设置,把快速链接、网站导航、信息提要、背景等全部关闭。这样你就能得到一个超级清爽的主页。 网站导航       关闭 …

《网络安全:数字时代的坚实护盾》

《网络安全:数字时代的坚实护盾》 在当今高度数字化的时代,网络安全的重要性如同空气对于生命一般不可或缺。它不仅关乎个人的隐私与财产安全,更对企业的生存发展和国家的稳定繁荣起着至关重要的作用。 对于个人而言,网络安全是保…

Vue 3 中实现懒加载功能

文章目录 一、懒加载的原理二、准备工作三、实现懒加载组件四、使用懒加载组件五、总结在现代前端开发中,懒加载是一种提高应用性能和用户体验的重要技术,尤其是在处理较大图片或长列表数据时。懒加载意味着仅在用户需要时才加载资源,这有助于减少初始加载时间和提升响应速度…

EmEditor传奇脚本编辑器

主程序:EmEditor.exe 目前已有功能 可以自己指定一个快捷键 实现以下功能(默认快捷键为:F1) 以下全功能 都是鼠标所在行 按快捷键 (默认快捷键:F1) 1.在Merchant.txt中 一键打开NPC 没有…

Git 下载及安装超详教程(2024)

操作环境:Win 10、全程联网 一、什么是Git? Git 是一个开源的分布式版本控制系统,由 Linus Torvalds 创立,用于有效、高速地处理从小到大的项目版本管理。Git 是目前世界上最流行的版本控制系统,被广泛用于软件开发中…

2款.NET开源且免费的Git可视化管理工具

Git是什么? Git是一种分布式版本控制系统,它可以记录文件的修改历史和版本变化,并可以支持多人协同开发。Git最初是由Linux开发者Linus Torvalds创建的,它具有高效、灵活、稳定等优点,如今已成为软件开发领域中最流行…

金融期货市场中的对冲策略及应用

金融期货市场在现代金融体系中扮演着至关重要的角色,为投资者和企业提供了对冲风险的有效工具。对冲策略通过期货合约的买卖,帮助市场参与者减轻价格波动的影响,从而在不确定的市场环境中获得稳定的收益。本文将探讨金融期货市场中的常见对冲…