JAVA 单播、多播(组播)、广播

简介: 单播”(Unicast)、“多播”(Multicast)和“广播”(Broadcast)这三个术语都是用来描述网络节点之间通讯方式的术语。那么这些术语究竟是什么意思?区别何在?1. 单播:网络节点之间的通信就好像是人们之间的对话一样。

单播”(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

参考文献:
http://www.apihome.cn/api/java/DatagramPacket.html

相关文章
|
11月前
java202303java学习笔记第三十九天单播,组播,广播1
java202303java学习笔记第三十九天单播,组播,广播1
37 0
|
网络协议 Java 网络性能优化
java网络编程(3)UDP协议编程(单播多播广播)
这一篇文章开始着重讲解UDP编程。这块的知识也算是非常重要的,而且现在的编程都离不开网络。花了一些时间整理了一下。
315 0
java网络编程(3)UDP协议编程(单播多播广播)
|
Java 网络协议
Java多播通讯框架 JGroups(转)
JGroups是一个可靠的群组通讯Java工具包。它基于IP组播(IP multicast),但在可靠性,组成员管理上对它作了扩展。 JGroups的可靠性体现在: 1,对所有接收者的消息的无丢失传输(通过丢失消息的重发)2,大消息的分割传输和重组3,消息的顺序发送和接收4,原子性:消息要么被所有接收者接收,要么全不 JavaGroups的成员关系管理体现在: 1,可以知道组内有哪些成员2,成员的加入,离开,掉线等的通知 JavaGroups的主要功能特征: - 组的创建与删除。
1428 0
|
2天前
|
安全 Java 调度
深入理解Java并发编程:线程安全与性能优化
【5月更文挑战第12天】 在现代软件开发中,多线程编程是提升应用程序性能和响应能力的关键手段之一。特别是在Java语言中,由于其内置的跨平台线程支持,开发者可以轻松地创建和管理线程。然而,随之而来的并发问题也不容小觑。本文将探讨Java并发编程的核心概念,包括线程安全策略、锁机制以及性能优化技巧。通过实例分析与性能比较,我们旨在为读者提供一套既确保线程安全又兼顾性能的编程指导。
|
2天前
|
Java
Java中的多线程编程:基础知识与实践
【5月更文挑战第13天】在计算机科学中,多线程是一种使得程序可以同时执行多个任务的技术。在Java语言中,多线程的实现主要依赖于java.lang.Thread类和java.lang.Runnable接口。本文将深入探讨Java中的多线程编程,包括其基本概念、实现方法以及一些常见的问题和解决方案。
|
2天前
|
安全 算法 Java
深入理解Java并发编程:线程安全与性能优化
【5月更文挑战第13天】 在Java开发中,并发编程是一个复杂且重要的领域。它不仅关系到程序的线程安全性,也直接影响到系统的性能表现。本文将探讨Java并发编程的核心概念,包括线程同步机制、锁优化技术以及如何平衡线程安全和性能。通过分析具体案例,我们将提供实用的编程技巧和最佳实践,帮助开发者在确保线程安全的同时,提升应用性能。
10 1
|
2天前
|
Java 调度
Java一分钟之线程池:ExecutorService与Future
【5月更文挑战第12天】Java并发编程中,`ExecutorService`和`Future`是关键组件,简化多线程并提供异步执行能力。`ExecutorService`是线程池接口,用于提交任务到线程池,如`ThreadPoolExecutor`和`ScheduledThreadPoolExecutor`。通过`submit()`提交任务并返回`Future`对象,可检查任务状态、获取结果或取消任务。注意处理`ExecutionException`和避免无限等待。实战示例展示了如何异步执行任务并获取结果。理解这些概念对提升并发性能至关重要。
17 5
|
3天前
|
Java
Java一分钟:线程协作:wait(), notify(), notifyAll()
【5月更文挑战第11天】本文介绍了Java多线程编程中的`wait()`, `notify()`, `notifyAll()`方法,它们用于线程间通信和同步。这些方法在`synchronized`代码块中使用,控制线程执行和资源访问。文章讨论了常见问题,如死锁、未捕获异常、同步使用错误及通知错误,并提供了生产者-消费者模型的示例代码,强调理解并正确使用这些方法对实现线程协作的重要性。
14 3