近期由于需要编写能够使同一局域网中的Android客户端与PC端进行自动匹配通信功能的程序,学习并试验了JAVA组播与广播的内容,记录一些理解如下:
一.组播(多播)
背景知识:组播使用UDP对一定范围内的地址发送相同的一组Packet,即一次可以向多个接受者发出信息,其与单播的主要区别是地址的形式。IP协议分配了一定范围的地址空间给多播(多播只能使用这个范围内的IP),IPv4中组播地址范围为224.0.0.0到239.255.255.255。
JAVA编程:java中通过MulticastSocket实例进行通信,使用时涉及到几个概念①TTL(Time To Live),每个IP报文都包含一个TTL(是一个数字),报文每被一个路由转发一次它的TTL减1,当TTL变为0时,该报文被丢弃②多播组(multicast group),接受者只有加入这个组才能获取发送到该组的报文(这就确定了组播的对象)
JAVA代码:
发送端(Android手机):
//-----------------------------------------------------------------------------------------
MulticastSocket mSocket = new MulticastSocket(30001);//生成套接字并绑定30001端口
InetAddress group=InetAddress.getByName("239.0.0.1");//设定多播IP
byte[] buff = "QQ".getBytes("utf-8");//设定多播报文的数据
mSocket.joinGroup(group);//加入多播组,发送方和接受方处于同一组时,接收方可抓取多播报文信息
mSocket.setTimeToLive(4);//设定TTL
//设定UDP报文(内容,内容长度,多播组,端口)
DatagramPacket packet = new DatagramPacket(buff,buff.length,group,30001);
mSocket.send(packet);//发送报文
mSocket.close();//关闭套接字
//-----------------------------------------------------------------------------------------
接收端(PC):
//-----------------------------------------------------------------------------------------
MulticastSocket s = new MulticastSocket(30001);//生成套接字并绑定端口
InetAddress group = InetAddress.getByName("239.0.0.1");//设定多播IP
s.joinGroup(group);//接受者加入多播组,需要和发送者在同一组
DatagramPacket packet = new DatagramPacket(buffer , 100);//创建接收报文,以接收通过多播传递过来的报文
s.receive(packet);//接收多播报文,程序停滞等待直到接收到报文
s.close();//关闭套接字
//-----------------------------------------------------------------------------------------
注意事项:
1.windows系统中的TCP/IP 的媒体感知功能会导致组播报出这样的错误:
java.net.SocketException: IP_ADD_MEMBERSHIP failed (out of hardware filters?)
windows7环境下解决方法如下:
使用注册表编辑器 (运行中键入regedit) 来查看下面的注册表项: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters (Tcpip类似文件夹一样的图标能展开里面有Parameters,第一次找了很久)
添加以下注册表值:
数值名称:DisableDHCPMediaSense 数据类型:REG_DWORD 即(DWORD(32-位)值)创建后右击修改其值为1,即关闭,重启机器即可
2.笔者用PC直接连接宽带打开程序报错,切断宽带运行正常,猜测为路由器拒绝转发组播,此问题有待研究(由于笔者使用Windows hostednetwork创建笔记本自己的网络,将手机加入进来进行测试,所以对程序的测试仍可进行),此为实际程序中放弃使用组播的一个原因
3.不是所有的路由器都支持组播功能,并且一些支持组播的路由器默认为关闭组播的状态,所以目前使用组播写程序时需要考虑实际可用性的问题
二.广播
背景知识:
使用广播,本地网络中所有的主机都会受到一份数据副本。广播使用UDP报文,IPv4使用(255.255.255.255)地址发送广播,本地广播绝不会被路由器转发,即广播信息会被限制在本地网络之内。
JAVA编程:
UDP单播和广播类似,主要是IP不同,都是用DatagramSocket对象进行发送
JAVA代码:
发送端(Android手机)
//-----------------------------------------------------------------------------------------
byte[] buff = "QQ".getBytes("utf-8");//设定报文信息
DatagramSocket socket=new DatagramSocket();//建立套接字,参数端口号不填写,系统会自动分配一个可用端口
//创建报文,包括报文内容,内容长度,报文地址(这里全1地址即为广播),端口号(接受者需要使用该端口)
DatagramPacket packet=new DatagramPacket(buff,buff.length,InetAddress.getByName("255.255.255.255"), 30000);
socket.send(packet);//发送报文
socket.disconnect();//断开套接字
socket.close();//关闭套接字
//-----------------------------------------------------------------------------------------
接受端(PC):
//-----------------------------------------------------------------------------------------
DatagramSocket socket=new DatagramSocket(30000);//创建套接字
byte[] buffer;//创建接收字符串
buffer=new byte[35];
DatagramPacket packet = new DatagramPacket(buffer , buffer.length);//创建接收报文,以接收通过广播传递过来的
System.out.println("Listening at UDP(30000)....");
socket.receive(packet);//接收报文,程序停滞等待直到接收到报文
socket.disconnect();//断开套接字
socket.close();//关闭套接字
//--
转载自:http://blog.sina.com.cn/s/blog_751eaa830101cigu.html
分享到:
相关推荐
"下载更多打包源码~.url"可能是一个链接,指向更多相关的Android开发资源,"UDP_Multicast_Client"和"UDP_Multicast_Server"则是实际的Android应用项目文件,分别代表了UDP组播的客户端和服务器端代码。 在Android ...
在Android平台上实现组播通信,主要是利用UDP(User Datagram Protocol)协议的组播特性,这是一种高效的数据传输方式,尤其适用于需要向多个接收者同时发送相同数据的场景,如在线视频流、实时聊天应用等。...
组播是一种网络协议,允许一个数据包被发送到多个目的地,而不是一对一的单播或者一对多的广播。这对于实时流媒体、在线会议等场景非常有效,因为它减少了网络流量并优化了资源使用。以下是对"Android 组播例子"中...
Qt for Android 实现组播功能是一个关键的技术应用场景,尤其在开发多用户互动或者实时数据传输的应用中。在Android平台上使用Qt框架,开发者可以利用其强大的跨平台能力,结合组播技术来高效地传递数据给多个接收者...
【Android局域网UDP广播通信】是Android应用开发中的一个重要技术点,主要涉及网络编程、多播技术以及Android系统的权限管理。在这个场景中,应用程序利用UDP(User Datagram Protocol)协议,通过局域网进行数据...
与广播不同,组播只将数据发送到特定的组成员,而不会影响到整个网络。这有助于减少网络流量并提高带宽利用率。 描述中的“对udp通信里面的ip和端口号做文章”,指的是UDP通信的基本要素。每个UDP数据包都有源IP...
6. **多平台支持**:VLC支持Windows、Mac OS X、Linux、Android等多种操作系统,这意味着无论你使用哪种设备,都可以利用VLC进行组播测试。 7. **故障排查**:在进行组播测试时,可能会遇到播放不流畅、无法连接等...
其中音乐来源于手机本地,使用了Content Provider获取,播放音乐为了能后台播放,则在Service中实现,Activity和Service之间的通讯则利用了广播来实现,所以这个项目对增强Android基础知识来说是个很好的选择。...
总结来说,使用jrtp在Android上实现语音广播功能,你需要熟悉RTP和RTCP协议,理解音频编码和解码过程,掌握多播通信的原理,并能有效处理网络环境下的数据同步和流控制。在实践过程中,不断调试和优化,以提供稳定、...
《Google+Android开发入门与实战》是一本专为Android初学者设计的教程,它将带你逐步踏入Android应用开发的世界。本书不仅适合有一定编程基础的技术人员,也适合对移动开发感兴趣的非技术人员,通过深入浅出的方式...
Java是传统的开发语言,而Kotlin作为现代的、安全的编程语言,逐渐成为Android开发的首选。 4. **Activity和Intent**:Activity是Android应用的基本组件,代表用户可见的屏幕。Intent用于在不同组件之间传递消息,...
《Android开发源代码合集》是一个综合性的资源包,它包含了大量的Android开发相关的源代码示例,对于深入理解和学习Android编程具有极高的价值。在这个压缩包中,开发者可以找到各种功能模块、组件以及最佳实践的...
Android Android Android Android 开发背景 � 计算技术、无线接入技术的发展,使嵌入式系统逐渐有能力对桌面系统常规业务进行支持。 � 谷歌长期以来奉行的移动发展战略:通过与全球各地的手机制造商和移动运营商...
《Android开发指南中文版》是为想要学习或深入理解Android应用开发的开发者提供的一份详尽参考资料。这份文档涵盖了从入门到高级的各种主题,旨在帮助读者掌握Android平台上的应用程序设计和实现技巧。以下是对这份...
它是一组工具,为开发者提供了创建、测试和优化Android应用程序所需的一切。"Android SDK开发范例大全(2.0)版的源代码"是针对Android开发者的宝贵资源,其中包含了大量的示例代码,可以帮助开发者深入理解Android ...
这个合集旨在帮助那些对Android开发感兴趣但英语基础较弱的开发者更好地理解和应用Android API。尽管对于有一定基础的开发者来说,官方的英文文档可能是更好的选择,但对于初学者,这个中文版本无疑降低了学习的门槛...
Android框架与应用开发是移动开发领域中的核心组成部分,它为开发者提供了一个强大的平台来构建功能丰富的应用程序。Android框架包括一系列的组件和服务,这些组件协同工作,使得开发者能够创建交互式的用户体验,...
通过分析"android 项目开发详解代码",你可以学习到上述各个知识点的实际应用,这将有助于你从理论到实践的过渡,提升Android开发技能。对于初学者来说,跟随源代码的逻辑,一步步运行和调试,将是学习过程中非常...
【Android开发教程&笔记】 Android开发是全球最受欢迎的移动操作系统之一,它的开源性质使得开发者能够创建各种创新的应用程序。这份“Android开发教程&笔记”旨在为初学者提供一个全面的学习路径,帮助他们从零...
在Android开发中,NDK(Native Development Kit)是Google提供的一套工具,允许开发者使用C和C++编写原生代码,以提升应用的性能,尤其是处理密集型计算任务,如音频处理、图像处理和信号处理等领域。而DSP(Digital...