java网络通信-组播

   在信息时代,网络技术应用已经很普通。其中很多应用都依赖于从一个主机向多个主机或者从多个主机向多个主机发送同一信息的能力,在Internet上分发的数目可能达数十万台,这些都需要更高的带宽,并且大大超出了单播的能力。一种能最大限度地利用现有带宽的重要技术是IP组播。

1.IP组播技术的概念

IP组播技术,是一种允许一台或多台主机(组播源)发送单一数据包到多台主机(一次的,同时的)的TCP/IP网络技术,是一点对多点的通信。在网络多媒体广播的应用中,当需要将一个节点的信号传送到多个节点时,无论是采用重复点对点通信方式,还是采用广播方式,都会严重浪费网络带宽,只有组播才是最好的选择。组播能使一个或多个组播源只把数据包发送给特定的组播组,而只有加入该组播组的主机才能接收到数据包。
2.IP组播地址

IP组播通信依赖于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,可限制组播范围。

3.组播组

使用同一个IP组播地址接收组播数据包的所有主机构成了一个主机组,也称为组播组。一个组播组的成员是随时变动的,一台主机可以随时加入或离开组播组,组播组成员的数目和所在的地理位置也不受限制,一台主机也可以属于几个组播组。此外,不属于某一个组播组的主机也可以向该组播组发送数据包。



    组播消息可以跨网段传播吗?
    组播是可以跨网段的,只要路由器支持.跨网段组播必须打开三层交换机的组播路由协议,一般是PIM 稀疏模式,
    一般三层交换机的默认配置是没有打开组播路由的。


    编辑一个java组播应用程序的过程如下

1. 创建一个用于发送和接收的MulticastSocket组播套接字对象
2. 创建一个指定缓冲区大小及组播地址和端口的DatagramPacket组播数据包对象
3. 使用组播套接字joinGroup(),将其加入到一个组播
4. 使用组播套接字的send()方法,将组播数据包对象放入其中,发送组播数据包.
   或者
   使用组播套接字的receive()方法,将组播数据包对象放入其中,接收组播数据包
5. 解码组播数据包提取信息,并依据得到的信息作出响应String s = new String(dp.getData(), 0, dp.getLength());
6. 重复过程4和5,即在while循环中实现。
7. 使用组播套接字的leaveGroup()方法,离开组播组;关闭组播套接字

接收组播数据包程序:

   
     package com.multicast.test;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;

public class MulticastReceived {

    public static void main(String[] args) throws Exception {
        InetAddress group = InetAddress.getByName("224.0.0.1"); // 组播地址
        int port = 4000; // 端口
        MulticastSocket msr = null;
        try {
            msr = new MulticastSocket(port); // 1.创建一个用于发送和接收的MulticastSocket组播套接字对象
            msr.joinGroup(group); // 3.使用组播套接字joinGroup(),将其加入到一个组播
            byte[] buffer = new byte[8192];
            System.out.println("接收数据包启动!(启动时间:)" + new java.util.Date() + ")");
            while (true) {
                DatagramPacket dp = new DatagramPacket(buffer, buffer.length); // 2.创建一个指定缓冲区大小及组播地址和端口的DatagramPacket组播数据包对象
                msr.receive(dp); // 4.使用组播套接字的receive()方法,将组播数据包对象放入其中,接收组播数据包
                String s = new String(dp.getData(), 0, dp.getLength()); // 5.解码组播数据包提取信息,并依据得到的信息作出响应
                System.out.println(s);
            }
        } catch (IOException e) {
            e.printStackTrace();

        } finally {
            if (msr != null) {
                try {
                    msr.leaveGroup(group); // 7.使用组播套接字的leaveGroup()方法,离开组播组
                    msr.close(); // 关闭组播套接字
                } catch (IOException e) {
                }
            }
        }
    }
}



    





    发送组播数据包程序:
   
    package com.multicast.test;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;

public class MulticastSender {

    public static void main(String[] args) throws Exception {
        InetAddress group = InetAddress.getByName("224.0.0.1"); // 组播地址
        int port = 4000; // 端口
        MulticastSocket mss = null;
        try {
            mss = new MulticastSocket(port); // 1.创建一个用于发送和接收的MulticastSocket组播套接字对象
            mss.joinGroup(group); // 3.使用组播套接字joinGroup(),将其加入到一个组播
            System.out.println("接收数据包启动!(启动时间:)" + new java.util.Date() + ")");
            while (true) {
                String message = "Hello world!" + new java.util.Date();
                byte[] buffer = message.getBytes(); // 2.创建一个指定缓冲区大小及组播地址和端口的DatagramPacket组播数据包对象

                DatagramPacket dp = new DatagramPacket(buffer, buffer.length, group, port);

                mss.send(dp); // 4.使用组播套接字的send()方法,将组播数据包对象放入其中,发送组播数据包
                // String s = new String(dp.getData(), 0, dp.getLength()); //5.解码组播数据包提取信息,并依据得到的信息作出响应
                System.out.println("发送数据包给" + group + ":" + port);
                Thread.sleep(1000);
            }
        } catch (IOException e) {
            e.printStackTrace();

        } finally {
            if (mss != null) {
                try {
                    mss.leaveGroup(group); // 7.使用组播套接字的leaveGroup()方法,离开组播组
                    mss.close(); // 关闭组播套接字
                } catch (IOException e) {
                }
            }
        }
    }
}
    


  

猜你喜欢

转载自guo-xiuye.iteye.com/blog/2165985
今日推荐