原文地址:http://blog.sina.com.cn/s/blog_49843aeb0100i0bc.html
组播
作用:主机间通信使用、路由间通信使用
概念:IP组播技术,是一种允许一台或多台主机(组播源)发送单一数据包到多台主机(一次的,同时的)的TCP/IP网络技术,是一点对多点的通信
为什么用它:在网络多媒体广播的应用中,当需要将一个节点的信号传送到多个节点时,无论是采用重复点对点通信方式,还是采用广播方式,都会严重浪费网络带宽,只有组播才是最好的选择。组播能使一个或多个组播源只把数据包发送给特定的组播组,而只有加入该组播组的主机才能接收到数据包。
IP组播地址:P组播通信依赖于IP组播地址,在IPv4中它是一个D类IP地址,范围从224.0.0.0到239.255.255.255,并被划分为局部链接组播地址、预留组播地址和管理权限组播地址三类。其中,局部链接组播地址范围在224.0.0.0~224.0.0.255,这是为路由协议和其它用途保留的地址,路由器并不转发属于此范围的IP包;预留组播地址为224.0.1.0~238.255.255.255,可用于全球范围(如Internet)或网络协议;管理权限组播地址为239.0.0.0~239.255.255.255,可供组织内部使用,类似于私有IP地址,不能用于Internet,可限制组播范围。
组播组:使用同一个IP组播地址接收组播数据包的所有主机构成了一个主机组,也称为组播组。一个组播组的成员是随时变动的,一台主机可以随时加入或离开组播组,组播组成员的数目和所在的地理位置也不受限制,一台主机也可以属于几个组播组。此外,不属于某一个组播组的主机也可以向该组播组发送数据包。
Java Example:
Server端:
public class Server { public static String GROUP_IP = "239.1.1.1"; public static int LISTEN_PORT = 22345; public static void run() throws UnknownHostException, IOException { System.out.println("server start......."); MulticastSocket multicastSocket = new MulticastSocket(LISTEN_PORT); InetAddress group = InetAddress.getByName(GROUP_IP); multicastSocket.joinGroup(group); byte[] data = new byte[50]; //未填满空间会被0填充,如果数据长度超出数组则超出的数据被忽略 DatagramPacket packet = new DatagramPacket(data, data.length); while (true) { try { multicastSocket.receive(packet); System.out.println(new String(data)+packet.getAddress()+" "+ new SimpleDateFormat("yy-mm-dd - HH:mm:ss").format(new Date())); } catch (IOException ex) { JOptionPane.showMessageDialog(null, "multicast error"); System.exit(1); } } } public static void main(String[] args){ try{ Server.run(); }catch(Exception e){ e.printStackTrace(); } } }
Client端:
public class Client { public static void run() throws IOException, InterruptedException { System.out.println("client start......."); String name = "ClientID:5"; MulticastSocket multicastSocket = new MulticastSocket();//其实这里使用DatagramSocket发送packet就行 InetAddress group = InetAddress.getByName(Server.GROUP_IP); String msg = "数据 become"+name; byte[] data = msg.getBytes(); DatagramPacket packet = new DatagramPacket(data, data.length, group, Server.LISTEN_PORT); int count =1; while (true) { try { multicastSocket.send(packet); System.out.println("send ok ["+name+"]-->"+ count ); count++; Thread.sleep(10000); } catch (IOException ex) { JOptionPane.showMessageDialog(null, "multicast error"); System.exit(1); } } } public static void main(String[] args){ try{ Client.run(); }catch(Exception e){ e.printStackTrace(); } } }
server端可以随时加入也可以随时退出!
client端发送的消息可以让所有加入的server都能收到!