原文链接:http://hbiao68.iteye.com/blog/1943354

使用MulticastSocket实现多点广播

DatagramSocket只允许数据报发送给指定的目标地址,而MulticastSocket可以将数据报以广播的方式发送到多个客户端

若要使用多点广播,则需要让一个数据报标有一组目标主机地址,当数据报发出后,整个组的所有所有主机都能收到该数据报。IP多点广播(或多点发送)实现了将单一信息发送到多个接受者的广播,其思想是设置一组特殊网络地址作为多点广播地址,每一个多点广播地址都被看做一个组,当客户端需要发送、接收广播信息时,加入到改组即可。

MulticastSocket既可以将数据报发送到多点广播地址,也可以接收其他主机的广播信息。

MulticastSocket有点像DatagramSocket,事实上MulitcastSocket是DatagramSocket的一个子类,当要发送一个数据报时,可以使用随机端口创建一个MulticastSocket,也可以在指定端口创建MulticastSocket。MulticastSocket提供了如下3个构造器。

1、MulticastSocket():使用本机默认地址、随机端口来创建MulticastSocket对象

2、MulticastSocket(int portNumber)使用本机默认地址、指定端口来创建对象

3、MulticastSocket(SocketAddress bindaddr):使用本机指定IP地址、指定端口来创建对象

创建MulticastSocket对象后,还需要将该MulticastSocket加入到指定的多点广播地址,MulticastSocket使用joinGroup()方法加入指定组;使用leaveGroup()方法脱离一个组。

1、joinGroup(InetAddress multicastAddr):将该MulticastSocket加入指定的多点广播地址。

2、leaveGroup(InetAddress multicastAddr):让该MulticastSocket离开指定的多点广播地址。

应用程序只将数据报包发送给组播地址,路由器将确保包被发送到改组播组中的所有主机。 
组播地址:称为组播组的一组主机所共享的地址。组播地址的范围在224.0.0.0--- 239.255.255.255之间(都为D类地址 1110开头)。

备注:如果现在有三台机器A、B、C,三台机器IP地址都不一样,A\B为server监听广播消息,C为客户端发送广播消息,个人理解是将A、B两台机器的MulticastSocket对象绑定在组播地址中的其中一个,然后C客户端发送消息的组播地址一致,则A、B就能够接收C发送的消息。

如果MulticastSocket用于接收信息则使用默认地址和随机端口即可,但是如果用来接收信息,则必须要指定端口,否则发送方无法确定发送数据报的目标端口。

  1. package hb.brodcast;
  2. import java.net.DatagramPacket;
  3. import java.net.InetAddress;
  4. import java.net.MulticastSocket;
  5. public class MulticastListener {
  6. private int port;
  7. private String host;
  8. public MulticastListener(String host, int port) {
  9. this.host = host;
  10. this.port = port;
  11. }
  12. public void listen() {
  13. byte[] data = new byte[256];
  14. try {
  15. InetAddress ip = InetAddress.getByName(this.host);
  16. MulticastSocket ms = new MulticastSocket(this.port);
  17. ms.joinGroup(ip);
  18. DatagramPacket packet = new DatagramPacket(data, data.length);
  19. //receive()是阻塞方法,会等待客户端发送过来的信息
  20. ms.receive(packet);
  21. String message = new String(packet.getData(), 0, packet.getLength());
  22. System.out.println(message);
  23. ms.close();
  24. } catch (Exception e) {
  25. e.printStackTrace();
  26. }
  27. }
  28. public static void main(String[] args) {
  29. int port = 1234;
  30. String host = "224.0.0.1";
  31. MulticastListener ml = new MulticastListener(host, port);
  32. while (true) {
  33. ml.listen();
  34. }
  35. }
  36. }
  1. package hb.brodcast;
  2. import java.net.DatagramPacket;
  3. import java.net.InetAddress;
  4. import java.net.MulticastSocket;
  5. public class MulticastSender {
  6. private int port;
  7. private String host;
  8. private String data;
  9. public MulticastSender(String data, String host, int port) {
  10. this.data = data;
  11. this.host = host;
  12. this.port = port;
  13. }
  14. public void send() {
  15. try {
  16. InetAddress ip = InetAddress.getByName(this.host);
  17. DatagramPacket packet = new DatagramPacket(this.data.getBytes(), this.data.length(), ip, this.port);
  18. MulticastSocket ms = new MulticastSocket();
  19. ms.send(packet);
  20. ms.close();
  21. } catch (Exception e) {
  22. e.printStackTrace();
  23. }
  24. }
  25. public static void main(String[] args) {
  26. int port = 1234;
  27. String host = "224.0.0.1";
  28. String data = "hello world.";
  29. System.out.println(data);
  30. MulticastSender ms = new MulticastSender(data, host, port);
  31. ms.send();
  32. }
  33. }

MulticastSocket用于发送、接收数据报的方法与DatagramSocket完全一样。但MulticastSocket比DatagramSocket多了一个setTimeToLive(int ttl)方法,该ttl参数用于设置数据报最多可以跨过多少个网络,当ttl的值为0时,指定数据报应停留在本地主机;当ttl的值为1时,指定数据报发送到本地局域网;当ttl的值为32时,意味着只能发送到本站点的网络上;当ttl的值为64时,意味着数据报应保留在本地区;当ttl的值为128时,意味着数据报应保留在本大洲;当ttl的值为255时,意味着数据报可发送到所有地方;在默认情况下,该ttl的值为1。

使用MulticastSocket实现多点广播的更多相关文章

  1. 17.4.3 使用MulticastSocket实现多点广播(4)

    17.4.3  使用MulticastSocket实现多点广播(4) 通过UserInfo类的封装,所有客户端只需要维护该UserInfo类的列表,程序就可以实现广播.发送私聊信息等功能.本程序底层通 ...

  2. 17.4.3 使用MulticastSocket实现多点广播(1)

    http://book.51cto.com/art/201203/322560.htm <疯狂Java讲义(第2版)>本书深入介绍了Java编程的相关方面,全书内容覆盖了Java的基本语法 ...

  3. 17.4.3 使用MulticastSocket实现多点广播(3)

    上面程序中init()方法里的第一行粗体字代码先创建了一个MulticastSocket对象,由于需要使用该对象接收数据报,所以为该Socket对象设置使用固定端口:第二行粗体字代码将该Socket对 ...

  4. 17.4.3 使用MulticastSocket实现多点广播(2)

    // 让该类实现Runnable接口,该类的实例可作为线程的target public class MulticastSocketTest implements Runnable { // 使用常量作 ...

  5. 17.4.3 使用MulticastSocket实现多点广播(5)

    该类主要实现底层的网络通信功能,在该类中提供了一个broadCast()方法,该方法使用Multicast Socket将指定字符串广播到所有客户端:还提供了sendSingle()方法,该方法使用D ...

  6. JAVA基础知识之网络编程——-使用MutilcastSocket实现多点广播

    IP多点广播原理 设置一组特殊网络地址作为多点广播地址,每一个多点广播地址都被看作一个组,当客户需要发送和接受信息时,加入到该组即可. IP协议为多点广播提供了一批特殊的IP地址,范围是224.0.0 ...

  7. java之DatagramSocket、DatagramPackage丶MulticastSocket 广播学习

    1.基本概念: a.DatagramPacket与DatagramSocket位于java.net包中 b.DatagramPacket表示存放数据的数据报,DatagramSocket表示接受或发送 ...

  8. Android开发之无线遥控器

    最近弄了一个UDP/TCP的小东西,主要需要实现的功能如下(服务器端): 1.基于局域网 2.服务器端网络接口为无线与有线 3.服务器端接收到客户端的数据需要模拟按键进行处理 4.开机自启动 5.使用 ...

  9. Android设备一对多录屏直播--(UDP组播连接,Tcp传输)

    原文:https://blog.csdn.net/sunmmer123/article/details/82734245 近期需要学习流媒体知识,做一个Android设备相互投屏Demo,因此找到了这 ...

随机推荐

  1. iOS self = [super init]

    self = [super init] 这个问题一直不太明白,今天研究了一下,在stackoverflow找到了下面的答案: http://stackoverflow.com/questions/29 ...

  2. (转)大数据时代下的SQL Server第三方负载均衡方案----Moebius测试

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 架构原理(Architecture) 测试环境(Environment) 安装Moebius( ...

  3. 在wpf中使用winrt的Toast弹框效果

    源码地址:https://code.msdn.microsoft.com/windowsdesktop/Sending-toast-notifications-71e230a2/sourcecode? ...

  4. modbus协议讲义

        Modbus 一个工业上常用的通讯协议.一种通讯约定.Modbus协议包括RTU.ASCII.TCP.其中MODBUS-RTU最常用,比较简单,在单片机上很容易实现.虽然RTU比较简单,但是看 ...

  5. 【QT】C++ GUI Qt4 学习笔记5

    折腾了好几天,终于把这本书的第三章和第四章给看了个大概. 里面的函数调用关系可谓是复杂. 整理了一部分的函数关系如下: cell关系清理 data(role) 返回应该显示的值 或者对齐方式 或者公式 ...

  6. [Android Pro] 网络流量安全测试工具Nogotofail

    reference to : http://www.freebuf.com/tools/50324.html 从严重的HeartBleed漏洞到苹果的gotofail 漏洞,再到最近的SSL v3 P ...

  7. Java堆、栈和常量池以及相关String的详细讲解

    一:在JAVA中,有六个不同的地方可以存储数据: 1. 寄存器(register). 这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部.但是寄存器的数量极其有限,所以寄存器由编译器根据 ...

  8. ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(八) 之 用 Redis 实现用户在线离线状态消息处理

    前言 上篇的预告好像是“聊天室的小细节,你都注意到了吗?”.今天也是为那篇做铺垫吧.之前的版本有好多问题,比如:当前登录用户是否合法问题,userid参数如果随便传后台没有验证.还有一个致命的问题,用 ...

  9. 设计模式之构建者模式(Builder):初步理解

    构建者(Builder)设计模式(又叫生成器设计模式): 当一个类的内部数据过于复杂的时候(通常是负责持有数据的类,比如Config.VO.PO.Entity...),要创建的话可能就需要了解这个类的 ...

  10. Lattice Diamond 学习之编译、检查和设置约束

    在新建工程以及完成代码的输入之后.则就要进行编译,并检测错误. 一. Generate Hierarchy(产生层次结构). 1. 点击Generate Hierarchy 图标或者Design -- ...