文档章节

java 单播、组播、广播

 专注移动开发
发布于 2015/03/06 16:56
字数 1340
阅读 22
收藏 0

单播”(Unicast)、“多播”(Multicast)和“广播”(Broadcast)这三个术语都是用来描述网络节点之间通讯方式的术语。那么这些术语究竟是什么意思?区别何在?

1. 单播:网络节点之间的通信就好像是人们之间的对话一样。如果一个人对另外一个人说话,那么用网络技术的术语来描述就是“单播”,此时信息的接收和传递只在两个节点之间进行。单播在网络中得到了广泛的应用,网络上绝大部分的数据都是以单播的形式传输的,只是一般网络用户不知道而已。例如,你在收发电子邮件、浏览网页时,必须与邮件服务器、Web服务器建立连接,此时使用的就是单播数据传输方式。但是通常使用“点对点通信”(Point to Point)代替“单播”,因为“单播”一般与“多播”和“广播”相对应使用。

2.多播:“多播”也可以称为“组播”,在网络技术的应用并不是很多,网上视频会议、网上视频点播特别适合采用多播方式。因为如果采用单播方式,逐个节点传输,有多少个目标节点,就会有多少次传送过程,这种方式显然效率极低,是不可取的;如果采用不区分目标、全部发送的广播方式,虽然一次可以传送完数据,但是显然达不到区分特定数据接收对象的目的。采用多播方式,既可以实现一次传送所有目标节点的数据,也可以达到只对特定对象传送数据的目的。IP网络的多播一般通过多播IP地址来实现。多播IP地址就是D类IP地址,即224.0.0.0至239.255.255.255之间的IP地址。 Windows 2000中的DHCP管理器支持多播IP地址的自动分配。

3.广播:“广播”在网络中的应用较多,如客户机通过 DHCP自动获得IP地址的过程就是通过广播来实现的。但是同单播和多播相比,广播几乎占用了子网内网络的所有带宽。拿开会打一个比方吧,在会场上只能有一个人发言,想象一下如果所有的人同时都用麦克风发言,那会场上就会乱成一锅粥。集线器由于其工作原理决定了不可能过滤广播风暴,一般的交换机也没有这一功能,不过现在有的网络交换机(如全向的QS系列交换机)也有过滤广播风暴功能了,路由器本身就有隔离广播风暴的作用。广播风暴不能完全杜绝,但是只能在同一子网内传播,就好像喇叭的声音只能在同一会场内传播一样,因此在由几百台甚至上千台电脑构成的大中型局域网中,一般进行子网划分,就像将一个大厅用墙壁隔离成许多小厅一样,以达到隔离广播风暴的目的。在IP网络中,广播地址用IP地址“255.255.255.255”来表示,这个IP地址代表同一子网内所有的IP地址。

 

多播示例代码  收藏代码

  1. package com.goma.test;  

  2.   

  3. import java.net.DatagramPacket;  

  4. import java.net.InetAddress;  

  5. import java.net.MulticastSocket;  

  6.   

  7. public class MultiCastSend {  

  8.     public static void main(String[]args){  

  9.         try {  

  10.             /******************发送组播数据****************/  

  11.             //指定组播IP  

  12.             InetAddress ip = InetAddress.getByName("228.5.6.7");  

  13.           

  14.             MulticastSocket s = new MulticastSocket();  

  15.             //加入该组   

  16.             s.joinGroup(ip);  

  17.               

  18.             //在多播中设置了TTl值(Time to live),每一个ip数据报文中都包含一个TTL,  

  19.             //每当有路由器转发该报文时,TTL减1,知道减为0时,生命周期结束,报文即时没有到达目的地,  

  20.             //也立即宣布死亡。当然在Java中,ttl并不是十分准确的,  

  21.             //曾经在一本书中介绍过报文的传播距离是不会超过ttl所设置的值的。  

  22.             s.setTimeToLive(1);  

  23.               

  24.             String msg = "IP:123123123;PORT:1231";  

  25.             DatagramPacket hi = new DatagramPacket(msg.getBytes(), msg.length(),ip, 6789);  

  26.             s.send(hi);  

  27.             /******************发送组播数据****************/  

  28.             s.close();  

  29.               

  30.         } catch (Exception e) {  

  31.             // TODO Auto-generated catch block  

  32.             e.printStackTrace();  

  33.         }  

  34.     }  

  35.   

  36. }  

  37.   

  38.   

  39.   

  40.   

  41.   

  42. package com.goma.test;  

  43.   

  44. import java.net.DatagramPacket;  

  45. import java.net.InetAddress;  

  46. import java.net.MulticastSocket;  

  47.   

  48. public class MultiCastReceive {  

  49.     public static void main(String[]args){  

  50.         try {  

  51.             //IP组  

  52.             InetAddress ip = InetAddress.getByName("228.5.6.7");  

  53.             //组播监听端口  

  54.             MulticastSocket s = new MulticastSocket(6789);  

  55.             //加入该组   

  56.             s.joinGroup(ip);  

  57.   

  58.             byte[] arb = new byte[24];  

  59.             while (true) {  

  60.                 DatagramPacket datagramPacket = new DatagramPacket(arb,arb.length);  

  61.                 s.receive(datagramPacket);  

  62.                 System.out.println(new String(datagramPacket.getData(), 0, datagramPacket.getLength()));  

  63.                 System.out.println(arb.length);  

  64.                 System.out.println(new String(arb));  

  65.             }  

  66.         } catch (Exception e) {  

  67.             // TODO Auto-generated catch block  

  68.             e.printStackTrace();  

  69.         }  

  70.     }  

  71. }  

 注:若在互联网上运行需要支持多播的路由器的支持(不可能每个客户端都安装相应的路由器,因此多播可以说,只支持局域网。)

 

Java广播代码  收藏代码

  1. package com.goma.test;  

  2.   

  3. import java.net.DatagramPacket;  

  4. import java.net.DatagramSocket;  

  5. import java.net.InetAddress;  

  6.   

  7. public class BroadCastSend {  

  8.   

  9.     /**  

  10.      * @param args  

  11.      */  

  12.     public static void main(String[] args) {  

  13.         // TODO Auto-generated method stub  

  14.         try {  

  15.             InetAddress ip = InetAddress.getByName("255.255.255.255");  

  16.             DatagramSocket ds = new DatagramSocket();  

  17.             String str = "Goma God Like.";  

  18.             DatagramPacket dp = new DatagramPacket(str.getBytes(),str.getBytes().length, ip, 3001);  

  19.             ds.send(dp);  

  20.             ds.close();  

  21.         } catch (Exception e) {  

  22.             // TODO Auto-generated catch block  

  23.             e.printStackTrace();  

  24.         }// 创建用来发送数据报包的套接字    

  25.     }  

  26. }  

  27.   

  28.   

  29.   

  30. package com.goma.test;  

  31.   

  32. import java.net.DatagramPacket;  

  33. import java.net.DatagramSocket;  

  34.   

  35. public class BroadCastReceive {  

  36.   

  37.     /**  

  38.      * @param args  

  39.      */  

  40.     public static void main(String[] args) {  

  41.         // TODO Auto-generated method stub  

  42.         try{  

  43.             DatagramSocket ds = new DatagramSocket(3001);// 创建接收数据报套接字并将其绑定到本地主机上的指定端口    

  44.             byte[] buf = new byte[1024];   

  45.             DatagramPacket dp = new DatagramPacket(buf, buf.length);  

  46.             ds.receive(dp);    

  47. //          String strRecv = new String(dp.getData(), 0, dp.getLength()) + " from "   + dp.getAddress().getHostAddress() + ":" + dp.getPort();   

  48.             System.out.println(new String(buf));    

  49.         }catch (Exception e) {  

  50.             // TODO: handle exception  

  51.             e.printStackTrace();  

  52.         }  

  53.     }  

  54.   

  55. }  


本文转载自:http://oma1989.iteye.com/blog/1967744

共有 人打赏支持
粉丝 3
博文 48
码字总数 3957
作品 0
杭州
技术主管
私信 提问
Sapphire 1.1.9 发布,Java 分布式缓存系统

Sapphire是一个高并发、高缓存吞吐性、高性能的Java分布式内存对象缓存系统,其具有简单易学、方便实用等特点。它能够用来存储各种格式的数 据,包括图像、视频、文件以及数据库检索的结果等...

oschina
2012/07/23
1K
0
netty3 UDP 组播问题

用netty3实现组播的服务器端代码,只能在linux上使用(win下无法接受组播)netty3有别于JAVA原始UDP组播实现方式 使用netty3实现组播同时还用绑定一个组播的本地端口(同组播端口一样的本地端...

蓝色火焰
2015/08/03
489
1
zbus 0.9.0 新版发布,MQ、RPC、微服务总线

经过相当长一段时间的重构优化,zbus新版0.9.0发布。 依然保持小巧极速易用,核心~400K Jar包,发行 ~3M,极少依赖,重点增强: 消息队列(MQ) 单播、广播、组播、订阅消息模式统一 支持磁盘...

少帮主
2017/09/18
4.3K
29
【JAVA】实现动态获得局域网中测试服务器地址

由于程序要拿到不同的地区去展示,需要临时搭建服务器,所以需要写一段代码来实现动态获得局域网中测试服务器的IP地址。 这个需要一些网络知识,虽然毕业于网络专业,但是概念基本忘光,经查...

Dean_King
2014/12/03
0
0
Netty 组播问题

环境:双网卡,Java项目,Netty框架 需求:Java项目内通过Netty发送组播到硬件,硬件只接收网卡一的组播 怎么确定从网卡一发送?具体的代码是在哪里设置? 现在采用 我看源码是根据HostName查...

AlkTTT
2017/07/26
79
1

没有更多内容

加载失败,请刷新页面

加载更多

RestClientUtil和ConfigRestClientUtil区别说明

RestClientUtil directly executes the DSL defined in the code. ConfigRestClientUtil gets the DSL defined in the configuration file by the DSL name and executes it. RestClientUtil......

bboss
40分钟前
6
0

中国龙-扬科
昨天
2
0
Linux系统设置全局的默认网络代理

更改全局配置文件/etc/profile all_proxy="all_proxy=socks://rahowviahva.ml:80/"ftp_proxy="ftp_proxy=http://rahowviahva.ml:80/"http_proxy="http_proxy=http://rahowviahva.ml:80/"......

临江仙卜算子
昨天
8
0
java框架学习日志-6(bean作用域和自动装配)

本章补充bean的作用域和自动装配 bean作用域 之前提到可以用scope来设置单例模式 <bean id="type" class="cn.dota2.tpye.Type" scope="singleton"></bean> 除此之外还有几种用法 singleton:......

白话
昨天
8
0
在PC上测试移动端网站和模拟手机浏览器的5大方法

总结很全面,保存下来以备不时之需。原文地址:https://www.cnblogs.com/coolfeng/p/4708942.html

kitty1116
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部