`

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) {
                }
            }
        }
    }
}
    


  
分享到:
评论

相关推荐

    java网络通信,UDP组播数据收发类及应用示例,可以指定组播收发数据的网卡即组播数据所在网络

    通常在主机多网卡的情况下,需要指定组播数据收发的网卡,即向那个网络发送组播数据,从那个网络接收组播数据,否则容易产生接收不到组播数据的情况。代码中给出的组播收发类直接调用即可,收发类可分开使用,通过...

    java源码包---java 源码 大量 实例

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    IP组播技术的java实现

    IP组播技术,是一种允许一台或多台主机(组播源)发送单一数据包到多台主机(一次的,同时的)的TCP/IP网络技术,是一点对多点的通信。在网络多媒体广播的应用中,当需要将一个节点的信号传送到多个节点时,无论是...

    mcast组播测试工具.zip

    组播测试工具,服务端发送数据,客户接收数据, java -jar mcastclient.jar -ipaddress 230.22.182.199 -port 4446 -verbose java -jar mcastserver.jar -ipaddress 230.22.182.199 -port 4446 -delay 5000 -use...

    双网卡组播问题解决方案

    1.双网卡接收组播并转发消息; 2.双网卡同时工作; 3.通信通过UDP socket来完成; 4.实际问题,实际解决; 5.非网络专业人士,解决缺少理论支撑,方案仅供参考。

    java 基础知识之网络通信(TCP通信、UDP通信、多播以及NIO)总结

    主要介绍了java 基础知识之网络通信总结的相关资料,包括TCP通信、UDP通信、多播以及NIO,需要的朋友可以参考下

    Java源码包100个设计实例.zip

    Java 组播组中发送和接受数据实例 Java 飞机订票.rar Java 高考信息管理系统 SQL数据库.rar Java (Jsp)制作简单的表单程序.rar Java+ajax写的登录实例.rar JAVA+JSP的聊天室.rar Java+MsSQL超市进销存(毕业设计及...

    Java利用UDP协议实现多广播组通信源码

    利用Java语言基于UDP协议建立的多播广播组通信,可以实现一个服务器向多个客户端实时发送信息,基于GUI界面设计,可视化操作。

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    28个目标文件 内容索引:JAVA源码,媒体网络,飞鸽传书 Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程...

    JAVA上百实例源码以及开源项目源代码

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    java源码包4

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    java源码包3

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    JAVA上百实例源码以及开源项目

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    java开源包10

    PortGroper 是一款java写的开源拒绝服务测试工具,它不是僵尸网络类的ddos,而是使用大量的代理作为bots发起DDOS。Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是...

    java源码包2

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    java开源包1

    PortGroper 是一款java写的开源拒绝服务测试工具,它不是僵尸网络类的ddos,而是使用大量的代理作为bots发起DDOS。Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是...

    Java网络编程(第三版)中文版.part09.rar

    Java网络编程(第三版)中文版(不看后悔) JAVA Network Programming,Third Edition 原出版社: O'Reilly 作者: (美)Elliotte Rusty Harold [作译者介绍] 译者: 朱涛江[同译者作品] 林剑 丛书名: O'...

    java开源包11

    PortGroper 是一款java写的开源拒绝服务测试工具,它不是僵尸网络类的ddos,而是使用大量的代理作为bots发起DDOS。Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是...

    java开源包6

    PortGroper 是一款java写的开源拒绝服务测试工具,它不是僵尸网络类的ddos,而是使用大量的代理作为bots发起DDOS。Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是...

    java开源包4

    PortGroper 是一款java写的开源拒绝服务测试工具,它不是僵尸网络类的ddos,而是使用大量的代理作为bots发起DDOS。Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是...

Global site tag (gtag.js) - Google Analytics