java使用MulticastSocket实现多点广播

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

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

IP协议为多点广播提供了这批特殊的IP地址,这些地址的IP地址范围是224.0.0.0至239.255.255.255。

通过Java实现多点广播时,MulticastSocket类是实现这一功能的关键,当MulticastSocket把一个DatagramPacket发送到多点广播的IP地址,该数据报将被自动广播到加入该地址的所有MulticastSocket类既可以发送数据报到多点广播地址,也可以接受其他主机的广播信息。

MulticastSocket有点像DatagramSocket,事实上MulticastSocket是特殊的DatagramSocket。若要发送一个数据报时,可使用随机端口段间MulticastSocket,也可以指定端口来创建MulticastSocket。

MulticastSocket提供了如下三个构造器

public MulticastSocket():使用本机默认地址、随机端口来创建一个MulticastSocket对象。
public MulticastSocket(int number):使用本机默认地址、指定端口来创建一个MulticastSocket对象。
public MulticastSocket(SocketAddress bindaddr):使用本机指定IP地址、指定端口来创建一个MulticastSocket对象。

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

joinGroup(InetAddress multicastAddr):将该MulticastSocket加入指定的多点广播地址
leaveGroup(InetAddress multicastAddr):让该MulticastSocket离开指定的多点广播地址。

在某些系统中,可能有多个网络接口。这可能会对多点广播带来问题,这时候程序需要在一个指定的网络接口上监听,通过调用setInterface可选择MulticastSocket所使用的网络接口;页可以使用getInterface方法查询MulticastSocket监听的网络接口。

如果创建仅用于发送数据报的MulticastSocket对象,则使用默认地址、随机端口即可。但如果创建接收用的MulticastSocket对象,则该MulticastSocket对象必须有指定端口,否则发送方无法确定发送的数据报的目标端口。

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

使用MulticastSocket进行多点广播时所有通信实体都是平等的,他们都将自己的数据报发送到多点广播IP地址,并使用MulticastSocket接收其他人发送的广播数据报。

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

//让该类实现Runnable接口,该类的实例可作为线程的target
public class Test implements Runnable {
 // 使用常量作为本程序的多点广播IP地址
 private static final String BROADCAST_IP = "230.0.0.1";
 // 使用常量作为本程序的多点广播目的的端口
 public static final int BROADCAST_PORT = 30000;
 // 定义每个数据报的最大大小为4K
 private static final int DATA_LEN = 4096;
 // 定义本程序的MulticastSocket实例
 private MulticastSocket socket = null;
 private InetAddress broadcastAddress = null;
 private Scanner scan = null;
 // 定义接收网络数据的字节数组
 byte[] inBuff = new byte[DATA_LEN];
 // 以指定字节数组创建准备接受数据的DatagramPacket对象
 private DatagramPacket inPacket = new DatagramPacket(inBuff, inBuff.length);
 // 定义一个用于发送的DatagramPacket对象
 private DatagramPacket outPacket = null;

 public void init() throws IOException {
 try {
  // 创建用于发送、接收数据的MulticastSocket对象
  // 因为该MulticastSocket对象需要接收,所以有指定端口
  socket = new MulticastSocket(BROADCAST_PORT);
  broadcastAddress = InetAddress.getByName(BROADCAST_IP);
  // 将该socket加入指定的多点广播地址
  socket.joinGroup(broadcastAddress);
  // 设置本MulticastSocket发送的数据报被回送到自身
  socket.setLoopbackMode(false);
  // 初始化发送用的DatagramSocket,它包含一个长度为0的字节数组
  outPacket = new DatagramPacket(new byte[0], 0, broadcastAddress, BROADCAST_PORT);
  // 启动以本实例的run()方法作为线程体的线程
  new Thread(this).start();
  // 创建键盘输入流
  scan = new Scanner(System.in);
  // 不断读取键盘输入
  while (scan.hasNextLine()) {
  // 将键盘输入的一行字符串转换字节数组
  byte[] buff = scan.nextLine().getBytes();
  // 设置发送用的DatagramPacket里的字节数据
  outPacket.setData(buff);
  // 发送数据报
  socket.send(outPacket);
  }
 } finally {
  socket.close();
 }
 }

 public void run() {
 try {
  while (true) {
  // 读取Socket中的数据,读到的数据放在inPacket所封装的字节数组里。
  socket.receive(inPacket);
  // 打印输出从socket中读取的内容
  System.out.println("聊天信息:" + new String(inBuff, 0, inPacket.getLength()));
  }
 }
 // 捕捉异常
 catch (IOException ex) {
  ex.printStackTrace();
  try {
  if (socket != null) {
   // 让该Socket离开该多点IP广播地址
   socket.leaveGroup(broadcastAddress);
   // 关闭该Socket对象
   socket.close();
  }
  System.exit(1);
  } catch (IOException e) {
  e.printStackTrace();
  }
 }
 }

 public static void main(String[] args) throws IOException {
 new Test().init();
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java并发的CAS原理与ABA问题的讲解

    CAS原理 在计算机科学中,比较和交换(Compare And Swap)是用于实现多线程同步的原子指令. 它将内存位置的内容与给定值进行比较,只有在相同的情况下,将该内存位置的内容修改为新的给定值. 这是作为单个原子操作完成的. 原子性保证新值基于最新信息计算; 如果该值在同一时间被另一个线程更新,则写入将失败. 操作结果必须说明是否进行替换; 这可以通过一个简单的布尔响应(这个变体通常称为比较和设置),或通过返回从内存位置读取的值来完成(摘自维基本科) CAS流程 以AtomicIntege

  • Java多线程之CAS算法实现线程安全

    前言 对于线程安全,我们有说不尽的话题.大多数保证线程安全的方法是添加各种类型锁,使用各种同步机制,用限制对共享的.可变的类变量并发访问的方式来保证线程安全.文本从另一个角度,使用"比较交换算法"(CompareAndSwap)实现同样的需求.我们实现一个简单的"栈",并逐步重构代码来进行讲解. 本文通俗易懂,不会涉及到过多的底层知识,适合初学者阅读(言外之意是各位大神可以绕道了). 旅程开始 1.先定个小目标,实现一个"栈" "栈&q

  • java使用MulticastSocket实现组播

    组播是一种允许源进程将数据包发送到多个目标进程的网络技术.组播源将数据包发送到特定组播组,只有属于该组播组的进程才能接收到数据包.这些进程可以是在同一个物理网络,也可以来自不同的物理网络(只要有组播路由器支持). 组播分为无连接和面向连接组播,但是基本的组播机制是无连接的,我们这里所讲的也是无连接组播. 我们说过使用MulticastSocket类,这个类叫组播数据报套接字类,主要用来发送和接收IP组播报文.MulticastSocket是DatagramSocket的子类,它增加了加入和离开组

  • java使用MulticastSocket实现多点广播

    DatagramSocket只允许数据报发送给指定的目标地址,而MulticastSocket可以将数据报以广播方式发送到数量不等的多个客户端. 若要使用多点广播时,则需要让一个数据报标有一组目标主机地址,当数据报发出后,整个组的所有主机都能收到该数据报.IP多点广播实现了将单一信息发送到多个接收者的广播,其思想是设置一组特殊网络地址作为广播地址,每个多点广播地址都被看做一个组,当客户端主要发送.接收信息时,加入到该组即可. IP协议为多点广播提供了这批特殊的IP地址,这些地址的IP地址范围是2

  • java使用MulticastSocket实现基于广播的多人聊天室

    使用MulticastSocket实现多点广播: (1)DatagramSocket只允许数据报发给指定的目标地址,而MulticastSocket可以将数据报以广播的方式发送到多个客户端. (2)IP协议为多点广播提供了这批特殊的IP地址,这些IP地址的范围是:224.0.0.0至239.255.255.255.. (3)MulticastSocket类时实现多点广播的关键,当MulticastSocket把一个DaragramPocket发送到多点广播的IP地址时,该数据报将会自动广播到加入

  • Android使用MulticastSocket实现多点广播图片

    DatagramSocket只允许数据报发送给指定的目标地址,而MulticastSocket可以将数据报以广播的方式发送至多个客户端.其主要思想是设置一组特殊网络地址作为多点广播地址,每个多点广播地址都被看做一个组,当客户端需要发送,接收广播消息时,加入到该组即可. IP协议为多点广播提供了这些特殊的IP地址,这些IP地址的范围是224.0.0.0至239.255.255.255.当MulticastSocket把一个DatagramPacket发送到多点广播IP地址时,该数据将被自动广播到加

  • Java使用MulticastSocket实现群聊应用程序

    本文实例为大家分享了Java使用MulticastSocket实现群聊应用程序的具体代码,供大家参考,具体内容如下 在这篇文章中,讨论了一个使用 MulticastSocket (Java Platform SE 7) 类的群聊应用程序.MulticastSocket 是一个 (UDP) DatagramSocket,具有加入 Internet 上其他多播主机“组”的附加功能. import java.net.*; import java.io.*; import java.util.*;  

  • java 单播、广播、组播详解及实例代码

    java 单播.广播.组播详解及实例代码 在当前网络通信中(TCP/IP也不例外)有三种通信模式:单播.广播.组播(又叫多播, 个人感觉叫多播描述的有点不恰当),其中多播出现的时间最晚,但同时具备单播和广播的优点,最具有发展前景. 一.通信方式分类: 1.单播:单台主机与单台主机之间的通信: 2.广播:单台主机与网络中所有主机的通信: 3.组播:单台主机与选定的一组主机的通信: 二.单播:    单播是网络通信中最常见的,网络节点之间的通信 就好像是人们之间的对话一样.如果一个人对另外一个人说话

  • Java中的IP地址和InetAddress类使用详解

    Java语言的优势之一是Java程序能访问网络资源.Java提供一系列的类支持Java程序访问网络资源. TCP/IP协议和IP地址 为了进行网络通信,通信双方必须遵守通信协议.目前最广泛使用的是TCP/IP协议,它是Internet中各方所遵循的公共协议.TCP(Transport Control Protocol)是一种传输控制协议,IP(Internet Protocol)是一种网际协议,TCP/IP代表这两个协议的. TCP/IP分为四个层次: 网络接口层:负责接收和发送物理帧: 网络层

  • 详解UDP协议格式及在java中的使用

    UDP是面向无连接的通讯协议,由于通讯不需要连接,所以可以实现广播发送.UDP通讯时不需要接收方确认,属于不可靠的传输,可能会出现丢包现象,实际应用中要求程序员编程验证. UDP适用于DNS.视频音频等多媒体通信.广播通信(广播.多播).例如我们常用的QQ,就是一个以UDP为主,TCP为辅的通讯协议. UDP报文格式如下: UDP首部有8个字节,由4个字段构成,每个字段都是两个字节, 源端口:数据发送方的端口号. 目的端口:数据接收方的端口号. 长度:UDP数据报的整个长度(包括首部和数据),其

  • Android编程实现基于局域网udp广播自动建立socket连接的方法

    本文实例讲述了Android编程实现基于局域网udp广播自动建立socket连接的方法.分享给大家供大家参考,具体如下: android开发中经常会用到socket通讯.由于项目需要,最近研究了一下这方面的知识. 需求是想通过wifi实现android移动设备和android平台的电视之间的文件传输与控制. 毫无疑问这中间一定需要用到socket来进行通信.今天就两台设备的握手连接方式分享一下吧,该方法只是本人个人想法的实现,仅供参考,如有雷同,不胜荣幸. 要想使用socket进行通讯,就必须知

  • android的UDP编程实例

    一.有的手机不能直接接收UDP包,可能是手机厂商在定制Rom的时候把这个功能给关掉了.1.可先在oncreate()方法里面实例化一个WifiManager.MulticastLock 对象lock:具体如下: 复制代码 代码如下: WifiManager manager = (WifiManager) this                .getSystemService(Context.WIFI_SERVICE);WifiManager.MulticastLock lock= manag

随机推荐