java组播MulticastSocket

在单播模式中有服务器端和客户端之分,而组播模式与单播模式不同,每个端都是以路由器或交换机做为中转广播站,任意一端向路由器或交换机发送消息,路由或交换机负责发送其他节点,每个节点都是同等的。所以在编程模式上用同一个类表示即可——MulticastSocket。

    MulticastSocket属于jdk提供的类,类路径为java.net.MulticastSocket,利用此类可以很方便地实现组播功能,下面展示一个简单例子,两个节点之间通过组播传输消息。

①节点一,指定组播地址为228.0.0.4,端口为8000,节点一通过调用MulticastSocket的joinGroup方法申请将节点一加入到组播队伍中,接着使用一个无限循环往组里发“Hello from node1”消息,这是为了方便节点2加入后接收节点1的消息做准备,需要说明的是组播是通过DatagramPacket对象发送消息的,调用MulticastSocket的send方法即可把消息发送出去。这里为了缩减例子长度省去了退出组及关闭套接字的一些操作,实际使用中需完善。

public class Node1 {

private static int port = 8000;

private static String address = "228.0.0.4";

public static void main(String[] args) throws Exception {

try {

InetAddress group = InetAddress.getByName(address); 

MulticastSocket mss = null;

mss = new MulticastSocket(port);

mss.joinGroup(group);

while (true) {

String message = "Hello from node1";

byte[] buffer = message.getBytes(); 

DatagramPacket dp = new DatagramPacket(buffer, buffer.length,

group, port);

mss.send(dp); 

Thread.sleep(1000);

}

} catch (IOException e) {

e.printStackTrace();

}

}

 

②节点二,指定同样的组播地址与端口,申请加入与节点一相同的组播组,接着通过循环不断接收来自其他节点发送的消息,通过MulticastSocket的receive方法可读到消息,将不断接收到来自节点一发送的消息“receive from node1:Hello from node1”。当然节点2也可以往组播组发送消息,因为每个节点都是同等的,只要其他节点对组播消息进行接收。如果你还想增加其他节点,尽管申请加入组播组,所有节点都可以接收发送消息。

public class Node2 {

private static int port = 8000;

private static String address = "228.0.0.4";

public static void main(String[] args) throws Exception {

InetAddress group = InetAddress.getByName(address); 

MulticastSocket msr = null;

try {

msr = new MulticastSocket(port);

msr.joinGroup(group);

byte[] buffer = new byte[1024];

while (true) {

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

msr.receive(dp); 

String s = new String(dp.getData(), 0, dp.getLength()); 

System.out.println("receive from node1:"+s);

}

} catch (IOException e) {

e.printStackTrace();

}

}

时间: 2024-12-21 22:40:43

java组播MulticastSocket的相关文章

【网络编程3】Java组播套接字

这篇博文是本文学习<Java网络程序设计>书中第5章中组播套接字的学习总结.所有源代码都在文章后面我的github链接代码中. --惠州学院13网络工程 吴成兵 20160612 目录 1 目录 1 一 组播套接字概述 二 MulticastSocket 21 MulticastSocket构造方法 22MulticastSocket常用方法 三 组播套接字编程 31 使用组播套接字发送数据的过程 32 使用组播套接字接收数据的过程 四 组播套接字编程示例 41 组播套接字发送和接收程序 41

用java的MulticastSocket实现的组播,在无线环境下接收不到数据包是怎么回事?求大牛们解释啊

问题描述 用java的MulticastSocket实现的组播,在无线环境下接收不到数据包,但是在有线环境下可以.无线环境是通过一个TL-WR340G无线路由器搭建的,有线环境是通过有线路由器搭建的 解决方案 解决方案二:自己顶下

Java数据报编程之组播

编程|数据   在信息时代,网络技术应用已经很普通.其中很多应用都依赖于从一个主机向多个主机或者从多个主机向多个主机发送同一信息的能力,在Internet上分发的数目可能达数十万台,这些都需要更高的带宽,并且大大超出了单播的能力.一种能最大限度地利用现有带宽的重要技术是IP组播. 1.IP组播技术的概念 IP组播技术,是一种允许一台或多台主机(组播源)发送单一数据包到多台主机(一次的,同时的)的TCP/IP网络技术,是一点对多点的通信.在网络多媒体广播的应用中,当需要将一个节点的信号传送到多个节

关于用java实现广播、组播的疑惑

问题描述 主机A和B同连一个无线路由,本人想写个局域网通信的程序.由于主机A和B的ip是由路由动态分配的,我试想通过A发广播,得到B(服务器)的ip.然后问题来了,A无论是广播还是组播,B都收不到数据包.求指点...代码如下packagebroadcast;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.net.DatagramPacket;impo

android-Android udp接收不到组播,请问如何解决?

问题描述 Android udp接收不到组播,请问如何解决? 50C 能接收到udp数据,但是接收不到udp组播数据,请各位大神帮帮忙,万分感谢!代码如下: package ncepu.wsy.udp_multicast_server; import java.net.DatagramPacket;import java.net.InetAddress;import java.net.MulticastSocket;import java.sql.Date;import java.text.Si

tcp-java环境下 组播可以是TCP连接基础上的吗?

问题描述 java环境下 组播可以是TCP连接基础上的吗? 我需要开发一个聊天室的案例 但是文本的传输需要可靠的TCP连接 但是我不知道java中是否有能实现基于TCP连接的组播方式? 解决方案 http://general.blog.51cto.com/927298/287496/

android上 用ffmpeg解码rtp组播流

问题描述 android上 用ffmpeg解码rtp组播流 android上 用ffmpeg解码rtp组播流,avformat_find_stream_info这一步总是失败,错误信息是 Connection timed out,同样的代码linux下测试是没问题的,移植到android后就不行,这是为什么呢? 解决方案 Connection timed out 连接超时.看看网络处理是否正确!! 解决方案二: 权限,看看权限,打印一些日志.安卓上的各位权限都看看! 解决方案三: 我也遇到这个问

C++UDP组播编程中,组播地址(组播号)与组播地址的关系是什么?和TCP中IP和端口的关系一样吗?

问题描述 C++UDP组播编程中,组播地址(组播号)与组播地址的关系是什么?和TCP中IP和端口的关系一样吗? C++UDP组播编程中,组播地址(组播号)与组播地址的关系是什么?和TCP中IP和端口的关系一样吗?另外,一台计算机上(不经过路由器或交换机)只能有一个组播吗?急求!!! 解决方案 组播地址和多播地支的关系与TCP中IP和端口的关系不太一样. 首先,网卡查看由信道传送过来的帧,确定是否接收该帧,若接收后就将它传往设备驱动程序.通常网卡仅接收那些目的地址为网卡物理地址或广播地址的帧. 使

jrtplib 组播- 【愁的肝疼】jrtplib库不能接收组播数据

问题描述 [愁的肝疼]jrtplib库不能接收组播数据 已经憋了1个多月了吧使用jrtplib 无论如何都不能接收组播的数据 单播数据可首发 组播数据可发送 下载了最新版本的 jrtplib-3.9.1在linux下也成功编译了example 示例运行也没啥问题就是组播数据不能接收 我在example1.cpp里添加了 加入组播的代码 也还是不成功 /* Here's a small IPv4 example: it asks for a portbase and a destination a