文档章节

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
博文 47
码字总数 3880
作品 0
杭州
技术主管
【JAVA】实现动态获得局域网中测试服务器地址

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

Dean_King
2014/12/03
0
0
MySQL多数据源笔记5-ShardingJDBC实战

Sharding-JDBC集分库分表、读写分离、分布式主键、柔性事务和数据治理与一身,提供一站式的解决分布式关系型数据库的解决方案。 从2.x版本开始,Sharding-JDBC正式将包名、Maven坐标、码云仓...

狂小白
03/19
0
0
Android 蓝牙设备的查找和连接

1.权限使用蓝牙设备需要先在Manifest中开放权限,位置如下。[html] view plaincopy 2.打开蓝牙获得蓝牙适配器(android.bluetooth.BluetoothAdapter),检查该设备是否支持蓝牙,如果支持,就...

木辰寿
2014/02/19
0
0
ElasticSearch 6.4.0 发布,正则表达式太长则拒绝搜索

ElasticSearch 6.4.0 发布了,Elasticsearch 是一个分布式的 RESTful 风格的搜索和数据分析引擎。 此版本显著更新包括: Plugins Plugins: 删除元插件 #30670 Search 如果正则表达式字符串太...

h4cd
08/24
0
0
基础总结篇之五:BroadcastReceiver应用详解

問渠那得清如許?為有源頭活水來。南宋.朱熹《觀書有感》 据说程序员是最爱学习的群体,IT男都知道,这个行业日新月异,必须不断地学习新知识,不断地为自己注入新鲜的血液,才能使自己跟上技...

Jonson
2013/09/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周日乱弹 —— 小心着凉 @红薯

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子:5.33起,其声呜呜然,如怨如慕,如泣如诉。余音袅袅,不绝如缕。分享Arch Enemy的单曲《Bridge Of Destiny (2009)》 《Bridge Of...

小小编辑
今天
170
4
what f,,

anlve
今天
2
0
初级开发-编程题

` public static void main(String[] args) { System.out.println(changeStrToUpperCase("user_name_abc")); System.out.println(changeStrToLowerCase(changeStrToUpperCase("user_name_abc......

小池仔
今天
14
0
现场看路演了!

HiBlock
昨天
21
0
Rabbit MQ基本概念介绍

RabbitMQ介绍 • RabbitMQ是一个消息中间件,是一个很好用的消息队列框架。 • ConnectionFactory、Connection、Channel都是RabbitMQ对外提供的API中最基本的对象。Connection是RabbitMQ的s...

寰宇01
昨天
17
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部