【网络编程】javaudp用MulticastSocket实现组播发送和接收数据

【⽹络编程】javaudp⽤MulticastSocket实现组播发送和接收数据
关于⽹络传播的介绍
⽹络数据传播按照接收者的数量,可分为以下3种⽅式。
·单播:提供点对点的通信。发送者每次发送的数据有着唯⼀的⽬的地址,只被⼀个接收者接收。
·⼴播:发送者每次发送的数据可以被传播范围内的所有接收者接收。电视台就采⽤⼴播⽅式。从电视台发射的信号被发送到传播范围内的每个点。不管电视机有没有打开,信号都能到达每台电视机。IP⽀持⼴播,但是由于⼴播会⼤⼤增加⽹络的数据流量,因此对⼴播的使⽤作了严格的限制。路由器可以限制对本地⽹络或⼦⽹的⼴播,并禁⽌对整个Internet的⼴播。此外,应该禁⽌⼴播那些占⾼带宽的数据,如⾳频和视频数据。试想如果⼀个实时视频流被⼴播给上亿的Internet⽤户,那么将使Internet严重超载,甚⾄崩溃。
八卦养生法·组播:发送者每次发送的数据可以被⼩组内的所有接收者接收。组播的接收范围介于单播和⼴播之间。对特定话题感兴趣的主机加⼊同⼀个组播组。向这个组发送的数据会到达组内所有的主机,但不会到达组外的主机。 当发送者要给1000个接收者发送同样的数据,如果采⽤单播,那么数据在发送⽅被复制1000份,分别传送给每个接收者,这种传播⽅式效率很低,因为它对数据进⾏了不必要的复制,浪费了
许多⽹络带宽。如果采⽤组播,则可以⼤⼤提⾼传输效率,路由器会动态决定组播数据的路由,只在必要时才复制数据
组播
组播组内的所有主机共享同⼀个地址,这种地址被称为组播地址。组播地址是范围在224.0.0.0 ~239.255.255.255之间的IP地址。此范围内的所有地址的前4个⼆进制位都是“1110”。组播地址也被称为D类IP地址,与其他的A类、B类和C类地址相区别。组播组是开放的,主机可以在任何时候进⼊或离开组。IPv6的组播地址都以⼗六进制值0xFF开头(对应的⼆进制值为11111111)
IANA(Internet Assigned Numbers Authority)组织负责分发永久组播地址。到⽬前为⽌,它已经分配了⼏百个地址。⼤多数已分配的地址以224.0、224.1、224.2或239开头,
导盲仪8-1永久组播地址
表8-1列出了⼀些永久组播地址。完整的组播地址分配列表可以从iana的官⽅⽹站获得。剩余的2.48亿个D类地址可以被任何需要的⼈⽤于临时⽬的。组播路由器(简称为mrouter)负责确保两个不同的⽹络系统不会同时使⽤相同的D类地址。从表8-1可以看出,与其他IP地址⼀样,组播地址也可以有域名,例如组播地址224.0.1.1的域名为ast。
⼤多数组播数据为⾳频或视频,这些数据⼀般都很⼤,即便部分数据在传输途中被丢失,接收⽅也仍然能识别信号。因此组播数据通过UDP 发送,虽然不可靠,但⽐⾯向连接的TCP的传输速度倍以上。 组播与单播UDP的区别在于,前者必须考虑TTL(Time To Live)值,它⽤IP数据包的头部的1字节表⽰。TTL通过限制IP包被丢弃前通过的路由器数⽬,来决定IP包的⽣存时间。IP包每通过⼀个路由器,TTL就减1,当TTL变为0,这个包就被丢弃。TTL的⼀个作⽤是防⽌配置有误的路由器把包在路由器之间⽆限地来回传递,还有⼀个作⽤是限制组播的地理范围。例如,当TTL为16时,包被限制在本地区域内传播,当TTL为255时,包将被发送到整个世界。不过,TTL并不能精确地决定包被传播的地理范围。⼀般情况下,接收⽅离得越远,包要经过的路由器就越多,TTL值⼩的包不会⽐TTL值⼤的包传播得更远。表8-2列出了TTL值与包传播的地理范围的粗略对应关系。值得意的是,⽆论TTL取什么值,如果包被发送给地址为224.0.0.0~224.0.0.255之间的组播组,则包只会在本地⼦⽹内传播,⽽不会被转发到其他⽹络。
阴阳互易
如果要收发本地⼦⽹以外的组播数据,那么要求本地⽹上配置了组播路由器(mrouter)。可以从⽹络管理员那⾥了解是否配置了mrouter,也可以运⾏命令“ast”,如果有路由器响应,则说明⽹络上有mrouter。 此外,即使⼦⽹上配置了mrouter,还是不能保证收发Internet上每⼀台主机的组播数据。如果要让包能到达组播组内的任何地址,那么需要在发送主机和接收主机之间存在
代码-发送数据报
条件 ⼀个局域⽹ ⼿机的⽹络调试精灵软件⾮常⽅便,可以在上⾯查看收到的数据报:
192.168.1.100是⼿机上⾃动的端⼝(不明⽩为啥跟电脑上ipconfig的ip不⼀样,明明是⼀个局域⽹)
public static void main(String[] args)throws IOException, InterruptedException {
Net net =new Net();
MulticastSocket multicastSocket2 =new MulticastSocket(null);
SocketAddress socketAddress =new InetSocketAddress(4000);
InetAddress group =ByName("192.168.1.100");
党政机关公务用车预算决算管理办法int port =4000;
multicastSocket2.bind(socketAddress);
String msg ="hello"+new Date();
byte[]buffer = Bytes(StandardCharsets.UTF_8);
DatagramPacket packet =new DatagramPacket(buffer,buffer.length,group,port);
while(true){
Thread.sleep(5000);
multicastSocket2.send(packet);
}
}
}
代码2 使⽤数据报接收其他⽤户发送的数据
效果:
注意ip和端⼝要相同
public class Test implements Runnable{
伽马private static final String BROADCAST_IP ="230.0.0.1";
// 使⽤常量作为本程序的多点⼴播⽬的的端⼝
public static final int BROADCAST_PORT =30000;
// 定义每个数据报的最⼤⼤⼩为4K
private static final int DATA_LEN =4096;
可爱的四兄弟
// 定义本程序的MulticastSocket实例
private MulticastSocket socket =null;
private InetAddress broadcastAddress =null;
private Scanner scan =null;
// 定义接收⽹络数据的字节数组
byte[] inBuff =new byte[DATA_LEN];
// 以指定字节数组创建准备接受数据的DatagramPacket对象
private DatagramPacket inPacket =new DatagramPacket(inBuff, inBuff.length); // 定义⼀个⽤于发送的DatagramPacket对象
private DatagramPacket outPacket =null;

本文发布于:2024-09-23 04:16:50,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/475985.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   组播   地址   路由器   范围   发送
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议