组播

组播发送端

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单播组播相关推荐

  1. UDP单播 组播 广播 区别及简单实现

    无论是tcp还是udp 服务器都必须绑定prot.Ip,客户端可以有选择性. udp单播: 单播只能是发送方往接收方指定的IP 端口发送数据 组播需具备的条件  1.接收方设置组播属性及组播号  2. ...

  2. 虚拟机无法接受组播消息_基于UDP的组播通信

    基于UDP的组播通信 在Java实现基于UDP协议的发送端与接收端通信中,我们可以知道它的一些主要操作: 在发送端:1,创建绑定指定端口的发送接口:DatagramSocket(port) 2,创建绑 ...

  3. 基于 UDP 的 组播、广播详解

    背景 有些时候我们在网络通信中也需要用到 组播(多播).广播.现在我们来介绍如何实现. 建议:在此之前,关闭防火墙. ubuntu: service ufw stop windows: 控制面板关闭 ...

  4. python socket发送组播数据_python3通过udp实现组播数据的发送和接收操作

    本文主要通过对海康摄像头进行抓包,模拟发送了udp包,并抓取摄像头返回的数据包,解析并提取相关信息. 通过抓包发现,海康摄像头发送.接收数据使用udp协议,后来比较发现,使用python模拟起来比较简 ...

  5. python获取本地时间并向服务器发送udp报文_python3通过udp实现组播数据的发送和接收操作...

    本文主要通过对海康摄像头进行抓包,模拟发送了udp包,并抓取摄像头返回的数据包,解析并提取相关信息. 通过抓包发现,海康摄像头发送.接收数据使用udp协议,后来比较发现,使用python模拟起来比较简 ...

  6. java udp 广播 组播_UDP广播和组播的基础知识介绍

    UDP广播和组播的基础知识介绍 ━━━━━━━━━━━━━━━━━━━━━━━━━ UDP可以实现一对多的传输方式,即通过广播和组播把数据发送给一组进程.下面就介绍下UDP广播和组播的相关知识. 一. ...

  7. 广播单播组播的知识总结与分享

    第一部分 基本概念 在网络中设备与设备通信也就是我们说的报文的传递.他们传递的方式分为以下几种:广播.单播和组播.我们以下提到的二层和三层指的是OSI模型,它总共工作分为七层:物理层.数据链路层.网络 ...

  8. 什么是“单播”“组播”和“多播”

    原文链接:https://zhidao.baidu.com/question/2120824.html 我的总结: 单播:一对一 组播:有相同需求的用户加入一个组.方便服务. 广播:就像电视.所有电视 ...

  9. 基于UDP的组播网络程序

    在服务器端: package Zubo; import java.io.IOException; import java.net.DatagramPacket; import java.net.Ine ...

  10. 脱离取源设备的IPTV宽带机房搭建心得(私网汇聚、内网直播源、单播组播模式混合使用、光猫机顶盒的破解、超级路由的组播转发)

    上个星期受用户邀请,去美丽的河南做了一个IPTV宽带机房的搭建,过程虽然有点坎坷,但好在最后都达到了用户的需求.在这里做一个记录,希望对我这种小菜日后方便参考使用,还望各位大神多多指教: 一.客户要求 ...

最新文章

  1. Java输入输出(标准)
  2. python基础之if、while、for语句
  3. (九十三)蓝牙的基本使用
  4. k8s 基础概念和术语
  5. oracle startup作用,【学习笔记】Oracle打补丁后startup migrate、startup upgrade区别分析...
  6. 【LeetCode】剑指 Offer 28. 对称的二叉树
  7. vasp 模拟退火_科学网—vasp的分子动力学模拟 - 王达的博文
  8. php serialize error at offset,unserialize(): Error at offset出现的原因分析以及解决方法
  9. 0基础web开发 python_真零基础Python开发web
  10. maven依赖关系中 scope属性含义
  11. power supply surges detected
  12. .bin文件的反汇编记录
  13. 【模型库】大卡车货车 集装箱 叉车 三维模型
  14. win10 win11 创建共享文件夹 mac 苹果电脑共享 无internet 安全,你的电脑只能访问本地网络中的其它设备 共享文件夹会导致本地电脑无法上网,
  15. 能够做到亚马逊月销售额50w以上的运营,他们有什么共同点 和技巧
  16. 雨量传感器测试(大众凌渡高尔夫7雨量传感器)
  17. MySQL的查询语言合集
  18. 关于emjoy表情在android5.x以上系统触发jni错误的修改(基于cocos2dx2.1.5修改)
  19. 汽车站订票系统mysql实验_数据库课程设计报告-车站售票管理系统
  20. 超级P2P搜索引擎让所有收费网站破产!

热门文章

  1. 浅说物联网之一:物联网圈子的三个玩家
  2. 谷歌浏览器Network详解
  3. 向量与矩阵的简单运算
  4. Dynamics CRM 2013学习伊始
  5. 线性插值法(一次插值多项式)的Python程序
  6. 思岚S2激光雷达1—初次连接
  7. 稳定同位素示踪技术在内源性物质代谢调控中的应用
  8. 基于opencv的重叠图像的凹点分割(C++)
  9. iphone与计算机连接,将 iPhone 与电脑同步
  10. fastadmin常规错误排查