使用MulticastSocket实现多点广播

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

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

Java代码  

  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. }

Java代码  

  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。

时间: 2024-08-24 09:08:06

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

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

上面程序中init()方法里的第一行粗体字代码先创建了一个MulticastSocket对象,由于需要使用该对象接收数据报,所以为该Socket对象设置使用固定端口:第二行粗体字代码将该Socket对象添加到指定的多点广播IP地址:第三行粗体字代码设置该Socket发送的数据报会被回送到自身(即该Socket可以接收到自己发送的数据报).至于程序中使用MulticastSocket发送.接收数据报的代码,与使用DatagramSocket并没有区别,故此处不再赘述. 下面将结合Multicast

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

// 让该类实现Runnable接口,该类的实例可作为线程的target public class MulticastSocketTest implements Runnable { // 使用常量作为本程序的多点广播IP地址 private static final String BROADCAST_IP = "230.0.0.1"; // 使用常量作为本程序的多点广播目的地端口 public static final int BROADCAST_PORT = 30000; // 定

【16-网络编程】

网络编程 网络的优势  •所谓计算机网络,就是把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大.功能强的网络系统,从而使众多的计算机可以方便地互相传递信息.共享硬件.软件.数据信息等资源. •计算机网络是现代通信技术与计算机技术相结合的产物,计算机网络可以提供以下一些主要功能. –资源共享. –信息传输与集中处理. –均衡负荷与分布处理. –综合信息服务.  按规模的三种分类 •局域网(LAN):指在一个较小地理范围内的各种计算机网络设备互连在一起的通信网络,可以包含一个或

Java笔记(9)-网络编程

不必说碧绿的菜畦,光滑的石井栏,高大的皂荚树,紫红的桑葚:也不必说鸣蝉在树叶里长吟,肥胖的黄蜂伏在菜花上,轻捷的叫天子(云雀)忽然从草间直窜向云霄里去了. 鲁迅 -–<从百草味到三味书屋> ---- [TOC] Java网络编程 URL 类 URL统一资源定位符 一个URL对象通常包含最基本的3部分信息:协议,地址,资源. 示例 用字节流读取流输入流中的数据时,由于汉字是两个字节,如果读取的长度不合适,就会有乱码,可以指定编码格式解决,增加一次读取的数据也可以解决, 用字符流也可以 中文乱码问

Java网络编程 探险

我们先来看看计算机网络主要功能:资源共享:信息传输和集中处理:负载均衡和分布处理:综合信息服务. 实际上Java的网络编程就是服务器通过ServerSocket建立监听,客户端通过Socket连接到指定服务器后,通信双方就可以通过IO流进行通信了. 1.认识网络编程 计算机网络中实现通信的约定被称为通信协议,通信协议负责对传输速率.传输代码.代码结构.传输控制步骤.出错控制等制定处理标准. 计算机网络的OSI模型(各种计算机网络的参考标准)如下: 1)上层协议 http,ftp,https 2)

Java 多客户端版 2048 源码

byte包 Calss Byte 1 package Byte; 2 import java.io.*; 3 public class Byte implements Serializable{ 4 public static byte[] int2Byte(int []intValue){ 5 int length=intValue.length; 6 byte[] b=new byte[length*4]; 7 for(int i=0;i<length;i++){ 8 for(int j=0

第13章 网络编程

1 /***************** 2 ***第13章 网络编程 3 *******知识点: 4 **************1.基本概念 5 ******************1.1 网络OSI模型 6 ******************1.2 IP地址 7 ******************1.3 端口地址 8 ******************1.4 通讯协议 9 **************2.Java网络相关类 10 ******************2.1 URLDe

疯狂Java讲义(第4版) PDF 电子书 百度云 网盘下载

java电子书推荐理由:1)作者提供用于学习和交流的配套网站及作者亲自在线的答疑微信群.QQ群. 2)DVD光盘中含 1500分钟图书部分内容的相关视频 图书配套代码 Java面试题真题 PPT课件 设计模式电子书 有助于完成课后练习的大量完整案例 3)<疯狂Java讲义>历时十年沉淀,现已升级到第4版,经过无数Java学习者的反复验证,被包括北京大学在内的大量985.211高校的优秀教师引荐为参考资料.选作教材. 4)<疯狂Java讲义>曾翻译为中文繁体字版,在宝岛台湾上市发行.

Android MulticastSocket IP组播

MulticastSocket是对等的关系,也就是他们通过IP多点组播保留的地址来相互接收在这个组的Socket发送的消息 我写了一个例子,MultiSocketB是一个service,用于先接收再发送,MultiSocketA用于先发送再接收,完成这一动作后退出 记得要加使用网络的权限 <uses-permission android:name="android.permission.INTERNET" /> 先看MultiSocketA <?xml version