JAVA实现UDP单播组播
组播
组播发送端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;/*** @author yichuan@iscas.ac.cn* @version 1.0* @date 2021/10/20 14:44*/
public class MulticastSender {public static void main(String[] args) throws IOException{int port = 8888;byte[] msg = "Connection successfully!!!".getBytes();InetAddress inetRemoteAddr = InetAddress.getByName("224.0.0.5");/** Java UDP组播应用程序主要通过MulticastSocket实例进行通信,它是DatagramSocket的是一个子类,* 其中包含了一些额外的可以控制多播的属性.** 注意:** 多播数据报包实际上可以通过DatagramSocket发送,只需要简单地指定一个多播地址。* 我们这里使用MulticastSocket,是因为它具有DatagramSocket没有的能力*/MulticastSocket client = new MulticastSocket();DatagramPacket sendPack = new DatagramPacket(msg, msg.length,inetRemoteAddr, port);client.send(sendPack);System.out.println("Client send msg complete");client.close();}
}
/*** 组播组可以是永久的也可以是临时的。组播组地址中,有一部分由官方分配的,称为永久组播组。永久组播组保持不变的是它的ip地址,组中的成员构成可以发生变化。永久组播组中成员的数量都可以是任意的,甚至可以为零。那些没有保留下来供永久组播组使用的ip组播地址,可以被临时组播组利用。* 224.0.0.0~224.0.0.255为预留的组播地址(永久组地址),地址224.0.0.0保留不做分配,其它地址供路由协议使用;* 224.0.1.0~224.0.1.255是公用组播地址,可以用于Internet;* 224.0.2.0~238.255.255.255为用户可用的组播地址(临时组地址),全网范围内有效;* 239.0.0.0~239.255.255.255为本地管理组播地址,仅在特定的本地范围内有效。** 组播地址列表如下:* 224.0.0.0 基准地址(保留)* 224.0.0.1 所有主机的地址 (包括所有路由器地址)* 224.0.0.2 所有组播路由器的地址* 224.0.0.3 不分配* 224.0.0.4 dvmrp路由器* 224.0.0.5 所有ospf路由器* 224.0.0.6 ospf DR/BDR* 224.0.0.7 st路由器* 224.0.0.8 st主机* 224.0.0.9 rip-2路由器* 224.0.0.10 Eigrp路由器* 224.0.0.11 活动代理* 224.0.0.12 dhcp 服务器/中继代理* 224.0.0.13 所有pim路由器* 224.0.0.14 rsvp封装* 224.0.0.15 所有cbt路由器* 224.0.0.16 指定sbm* 224.0.0.17 所有sbms* 224.0.0.18 vrrp*/
组播接收端
import old.util.NetworkUtil;
import java.net.*;
import java.util.Arrays;
import java.util.List;/*** @author yichuan@iscas.ac.cn* @version 1.0* @date 2021/10/20 14:45*/
public class MulticasReceiveNetworkCard {public static void main(String[] args) throws Exception{//InetAddress inetRemoteAddr = InetAddress.getByName("224.0.0.5");InetAddress group = InetAddress.getByName("224.0.0.5");DatagramPacket recvPack = new DatagramPacket(new byte[1024], 1024);//MulticastSocket server = new MulticastSocket(8888);int port = 8888;MulticastSocket socket = new MulticastSocket(port);int randomPort = port + 30000;List<NetworkInterface> addressList = NetworkUtil.getNetworkInterfaces();for (NetworkInterface networkInterface : addressList) {InetSocketAddress inetSocketAddress = newInetSocketAddress(group, randomPort);//将有效网卡加入组播socket.joinGroup(inetSocketAddress, networkInterface);randomPort++;}/** 如果是发送数据报包,可以不加入多播组; 如果是接收数据报包,必须加入多播组; 这里是接收数据报包,所以必须加入多播组;*///server.joinGroup(inetRemoteAddr);System.out.println("---------------------------------");System.out.println("SocketServer current start......");System.out.println("---------------------------------");while (true){socket.receive(recvPack);//server.receive(recvPack);byte[] recvByte = Arrays.copyOfRange(recvPack.getData(), 0,recvPack.getLength());System.out.println("SocketServer receive msg:" + new String(recvByte));}}
}
网卡工具类
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;/*** @author yichuan@iscas.ac.cn* @version 1.0* @date 2021/10/25 10:48*/
public class NetworkUtil {private final static String LOCAL_IP = "127.0.0.1";/*** 获取本机有效所有网卡地址** @return List<NetworkInterface> ip列表* @throws*/public static List<NetworkInterface> getNetworkInterfaces() throws Exception {List<NetworkInterface> localIPlist = new ArrayList<NetworkInterface>();Enumeration<NetworkInterface> interfs =NetworkInterface.getNetworkInterfaces();if (interfs == null) {return null;}while (interfs.hasMoreElements()) {NetworkInterface interf = interfs.nextElement();Enumeration<InetAddress> addres = interf.getInetAddresses();while (addres.hasMoreElements()) {InetAddress in = addres.nextElement();if (in instanceof Inet4Address) {if (!LOCAL_IP.equals(in.getHostAddress())){localIPlist.add(interf);}}}}return localIPlist;}
}
单播
单播发送端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;/*** @author yichuan@iscas.ac.cn* @version 1.0* @date 2021/10/20 9:12*/
/** 实现UDP协议的发送端:* 实现封装数据的类 java.net.DatagramPacket 将你的数据包装* 实现数据传输类 java.net.DatagramSocket 将数据包发出去** 实现步骤:* 1.创建DatagramPacket对象,封装数据,接收的地址和端口* 2.创建DatagramSocket对象,* 3.调用DatagramSocket类的方法send,发送数据包* 4.关闭资源** DatagramPacket构造方法:* DatagramPacket(byte[] buf,int length,InetAddress address,int port)** DatagramSocket构造方法:* DatagramSocket()空参数* 方法:send(DatagramPacket d)***/
public class UDPSend {public static void main(String[] args) throws IOException {//创建数据包对象,封装要发送的数据,接受端IP,端口byte[] data="你好UDP".getBytes();//创建InetAddress对象,封装自己的IP地址InetAddress inet=InetAddress.getByName("127.0.0.1");DatagramPacket dp=new DatagramPacket(data,data.length,inet,6000);//创建DatagramSocket对象,数据包的发送和接受对象DatagramSocket ds=new DatagramSocket();//调用ds对象的方法send,发送数据包ds.send(dp);ds.close();}
}
单播接收端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/*** @author yichuan@iscas.ac.cn* @version 1.0* @date 2021/10/20 9:17*/
/** 实现UDP接收端* 实现封装数据包java.net.DatagramPacket 将数据接收* 实现输出传输 java.net.DatagramSocket 接受数据包** 实现步骤:* 1.创建DatagramSocket对象,绑定端口号* 要和发送数据端口号一致* 2.创建字节数组,接受发来的数组* 3.创建数据包对象DatagramPacket* 4.调用DatagramSocket对象方法 receive(DatagramPacket dp)* 接受数据,数据放在数据包中* 5.拆包* 发送的IP地址* 数据包对象DatagramPacket()方法getAddress()获取的是发送端的IP地址对象* 接受到的字节个数* 数据包对象DatagramPacket()方法getLength()* 发送方的端口号* 数据包对象DatagramPacket()方法getPort()* 6.关闭资源*/
public class UDPReceive {public static void main(String[] args) throws IOException {//创建数据包传输对象DatagramSocket 绑定端口号DatagramSocket ds=new DatagramSocket(6000);//创建字节数组byte[] data=new byte[1024];//创建数据包对象,传递字节数组DatagramPacket dp=new DatagramPacket(data, data.length);//调用ds对象的方法receive传递数据包ds.receive(dp);//获取发送端的IP地址对象String ip=dp.getAddress().getHostAddress();//获取发送的端口号int port=dp.getPort();//获取接收到的字节数int length=dp.getLength();System.out.println(new String(data,0,length)+"...."+ip+":"+port);ds.close();}
}
JAVA实现UDP单播组播相关推荐
- UDP单播 组播 广播 区别及简单实现
无论是tcp还是udp 服务器都必须绑定prot.Ip,客户端可以有选择性. udp单播: 单播只能是发送方往接收方指定的IP 端口发送数据 组播需具备的条件 1.接收方设置组播属性及组播号 2. ...
- 虚拟机无法接受组播消息_基于UDP的组播通信
基于UDP的组播通信 在Java实现基于UDP协议的发送端与接收端通信中,我们可以知道它的一些主要操作: 在发送端:1,创建绑定指定端口的发送接口:DatagramSocket(port) 2,创建绑 ...
- 基于 UDP 的 组播、广播详解
背景 有些时候我们在网络通信中也需要用到 组播(多播).广播.现在我们来介绍如何实现. 建议:在此之前,关闭防火墙. ubuntu: service ufw stop windows: 控制面板关闭 ...
- python socket发送组播数据_python3通过udp实现组播数据的发送和接收操作
本文主要通过对海康摄像头进行抓包,模拟发送了udp包,并抓取摄像头返回的数据包,解析并提取相关信息. 通过抓包发现,海康摄像头发送.接收数据使用udp协议,后来比较发现,使用python模拟起来比较简 ...
- python获取本地时间并向服务器发送udp报文_python3通过udp实现组播数据的发送和接收操作...
本文主要通过对海康摄像头进行抓包,模拟发送了udp包,并抓取摄像头返回的数据包,解析并提取相关信息. 通过抓包发现,海康摄像头发送.接收数据使用udp协议,后来比较发现,使用python模拟起来比较简 ...
- java udp 广播 组播_UDP广播和组播的基础知识介绍
UDP广播和组播的基础知识介绍 ━━━━━━━━━━━━━━━━━━━━━━━━━ UDP可以实现一对多的传输方式,即通过广播和组播把数据发送给一组进程.下面就介绍下UDP广播和组播的相关知识. 一. ...
- 广播单播组播的知识总结与分享
第一部分 基本概念 在网络中设备与设备通信也就是我们说的报文的传递.他们传递的方式分为以下几种:广播.单播和组播.我们以下提到的二层和三层指的是OSI模型,它总共工作分为七层:物理层.数据链路层.网络 ...
- 什么是“单播”“组播”和“多播”
原文链接:https://zhidao.baidu.com/question/2120824.html 我的总结: 单播:一对一 组播:有相同需求的用户加入一个组.方便服务. 广播:就像电视.所有电视 ...
- 基于UDP的组播网络程序
在服务器端: package Zubo; import java.io.IOException; import java.net.DatagramPacket; import java.net.Ine ...
- 脱离取源设备的IPTV宽带机房搭建心得(私网汇聚、内网直播源、单播组播模式混合使用、光猫机顶盒的破解、超级路由的组播转发)
上个星期受用户邀请,去美丽的河南做了一个IPTV宽带机房的搭建,过程虽然有点坎坷,但好在最后都达到了用户的需求.在这里做一个记录,希望对我这种小菜日后方便参考使用,还望各位大神多多指教: 一.客户要求 ...
最新文章
- Java输入输出(标准)
- python基础之if、while、for语句
- (九十三)蓝牙的基本使用
- k8s 基础概念和术语
- oracle startup作用,【学习笔记】Oracle打补丁后startup migrate、startup upgrade区别分析...
- 【LeetCode】剑指 Offer 28. 对称的二叉树
- vasp 模拟退火_科学网—vasp的分子动力学模拟 - 王达的博文
- php serialize error at offset,unserialize(): Error at offset出现的原因分析以及解决方法
- 0基础web开发 python_真零基础Python开发web
- maven依赖关系中 scope属性含义
- power supply surges detected
- .bin文件的反汇编记录
- 【模型库】大卡车货车 集装箱 叉车 三维模型
- win10 win11 创建共享文件夹 mac 苹果电脑共享 无internet 安全,你的电脑只能访问本地网络中的其它设备 共享文件夹会导致本地电脑无法上网,
- 能够做到亚马逊月销售额50w以上的运营,他们有什么共同点 和技巧
- 雨量传感器测试(大众凌渡高尔夫7雨量传感器)
- MySQL的查询语言合集
- 关于emjoy表情在android5.x以上系统触发jni错误的修改(基于cocos2dx2.1.5修改)
- 汽车站订票系统mysql实验_数据库课程设计报告-车站售票管理系统
- 超级P2P搜索引擎让所有收费网站破产!