单播”(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地址。java
package com.goma.test; 网络
import java.net.DatagramPacket; spa
import java.net.InetAddress; .net
import java.net.MulticastSocket; orm
public class MultiCastSend { 视频
public static void main(String[]args){ 对象
try { 生命周期
/******************发送组播数据****************/ ip
//指定组播IP
InetAddress ip = InetAddress.getByName("228.5.6.7");
MulticastSocket s = new MulticastSocket();
//加入该组
s.joinGroup(ip);
//在多播中设置了TTl值(Time to live),每个ip数据报文中都包含一个TTL,
//每当有路由器转发该报文时,TTL减1,知道减为0时,生命周期结束,报文即时没有到达目的地,
//也当即宣布死亡。固然在Java中,ttl并非十分准确的,
//曾经在一本书中介绍过报文的传播距离是不会超过ttl所设置的值的。
s.setTimeToLive(1);
String msg = "IP:123123123;PORT:1231";
DatagramPacket hi = new DatagramPacket(msg.getBytes(), msg.length(),ip, 6789);
s.send(hi);
/******************发送组播数据****************/
s.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package com.goma.test;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
public class MultiCastReceive {
public static void main(String[]args){
try {
//IP组
InetAddress ip = InetAddress.getByName("228.5.6.7");
//组播监听端口
MulticastSocket s = new MulticastSocket(6789);
//加入该组
s.joinGroup(ip);
byte[] arb = new byte[24];
while (true) {
DatagramPacket datagramPacket = new DatagramPacket(arb,arb.length);
s.receive(datagramPacket);
System.out.println(new String(datagramPacket.getData(), 0, datagramPacket.getLength()));
System.out.println(arb.length);
System.out.println(new String(arb));
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
注:若在互联网上运行须要支持多播的路由器的支持(不可能每一个客户端都安装相应的路由器,所以多播能够说,只支持局域网。)
package com.goma.test;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class BroadCastSend {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
InetAddress ip = InetAddress.getByName("255.255.255.255");
DatagramSocket ds = new DatagramSocket();
String str = "Goma God Like.";
DatagramPacket dp = new DatagramPacket(str.getBytes(),str.getBytes().length, ip, 3001);
ds.send(dp);
ds.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}// 建立用来发送数据报包的套接字
}
}
package com.goma.test;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class BroadCastReceive {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try{
DatagramSocket ds = new DatagramSocket(3001);// 建立接收数据报套接字并将其绑定到本地主机上的指定端口
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);
ds.receive(dp);
// String strRecv = new String(dp.getData(), 0, dp.getLength()) + " from " + dp.getAddress().getHostAddress() + ":" + dp.getPort();
System.out.println(new String(buf));
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}