近期由于需要编写能够使同一局域网中的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

Android开发:组播(多播)与广播的更多相关文章

  1. 浅谈Android中的组播(多播)

    组播使用UDP对一定范围内的地址发送相同的一组Packet,即一次可以向多个接受者发出信息,其与单播的主要区别是地址的形式.IP协议分配了一定范围的地址空间给多播(多播只能使用这个范围内的IP),IP ...

  2. 【VS开发】组播(多播)的C程序实战

    每个人都有不同的认知规律和习惯, 有的人喜欢搞一套严密的大理论, 论述起来滔滔不绝, 不管自己懂不懂, 反正读者/听者是没搞懂. 有的人喜欢从实践出发, 没看到代码, 不运行一下, 不看到结果, 就不 ...

  3. android ONVIF 组播探测在线摄像机

    http://blog.csdn.net/ghostyu/article/details/8182516 Android的Wifi,默认情况下是不接受组播的,见:http://developer.an ...

  4. Android开发--Service和Activity通过广播传递消息

    Android的Service也运行在主线程,但是在服务里面是没法直接调用更改UI,如果需要服务传递消息给Activity,通过广播是其中的一种方法: 一.在服务里面发送广播 通过intent传送数据 ...

  5. <转>单播,广播,组播的缺点与优点

    原文链接:http://apje.blog.163.com/blog/static/145345252007101175714761/ 当前的网络中有三种通讯模式:单播.广播.组播(多播),其中的组播 ...

  6. Android App用MulticastSocket监听组播,为什么连接到不同路由、在不同手机上跑,有的能收到有的收不到

    ---------------------------!! 转载请注明出处 !!-----------------------   一个项目,利用wifi组播在局域网内发现设备.却发现在有的路由器上能 ...

  7. 《TCP/IP 详解 卷1:协议》第 9 章:广播和本地组播(IGMP 和 MLD)

    我已经懒了,卷一已经是去年年底看完的,但怎么说卷一的坑开了就要填完啊-- 广播和本地组播(IGMP 和 MLD) 引言 有 4 种 IP 地址,单播(unicast).任播(anycast).组播(m ...

  8. Linux网络编程四、UDP,广播和组播

    一.UDP UDP:是一个支持无连接的传输协议,全称是用户数据包协议(User Datagram Protocol).UDP协议无需像TCP一样要建立连接后才能发送封装的IP数据报,也是因此UDP相较 ...

  9. IP组播技术介绍及实现例子

    引 言 近年来,随着Internet的迅速普及和爆炸性发展,在Internet上产生了许多新的应用,其中不少是高带宽的多媒体应用,譬如网 络视频会议.网络音频/视频广播.AOD/VOD.股市行情发布. ...

  10. Python3组播通信编程实现教程(发送者+接收者)

    一.说明 1.1 标准组播解释 通信分为单播.多播(即组播).广播三种方式 单播指发送者发送之后,IP数据包被路由器发往目的IP指定的唯一一台设备的通信形式,比如你现在与web服务器通信就是单播形式 ...

随机推荐

  1. Inno Setup入门(十七)——Inno Setup类参考(3)

    分类: Install Setup 2013-02-02 11:28 433人阅读 评论(0) 收藏 举报 标签 标签(Label)是用来显示文本的主要组件之一,也是窗口应用程序中最常用的组件之一,通 ...

  2. kvm and virtualbox running side by side

    http://dedoimedo.com/computers/kvm-virtualbox.html

  3. [转]c++ new带括号和不带括号

    ref:http://m.blog.csdn.net/blog/u012745772/42420443 在new对象的时候有加上(),有不加(),不知道这个到底是什么区别?比如:CBase *base ...

  4. Spring中实现监听的方法

    在未使用框架进行编程的时候,我们常常在web.xml中加上这样一段话 <listener> <listener-class>XXX</listener-class> ...

  5. SEO策略与细节:细节决定成败

    昨天展开seo探讨会.听了一场医疗界seo大神的讲座.收益匪浅今天讲他的演讲内容整理出来与大家分享.希望对医疗界的seo带来些帮助.站长们一起成长! 一.首页 1.元标签设置 标题:上海癫痫病医院哪家 ...

  6. Android中实现滑动翻页—使用ViewFlipper(dp和px之间进行转换)

    Android中实现滑动翻页—使用ViewFlipper(dp和px之间进行转换) Android中dp和px之间进行转换 在xml布局文件中,我们既可以设置px,也可以设置dp(或者dip).一般情 ...

  7. iOS 开发之照片框架详解之二 —— PhotoKit 详解(上)

    转载自:http://kayosite.com/ios-development-and-detail-of-photo-framework-part-two.html 一. 概况 本文接着 iOS 开 ...

  8. JavaScript(2)——对象属性、原型与原型链

    对象属性.原型与原型链 哈哈哈,我的第二篇博客哟,说的是对象属性.原型与原型链.可能这些只是某些小点串联起来的,逻辑性没有很强.所以会对文章的可读性和理解性带来一些困扰.不过,今天我又前进了那么一小步 ...

  9. 基础-session,cookie,jsp,EL,JSTL

    会话可以简单理解为:用户打开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. kookie是在服务器端创建的,返回给浏览器,在浏览器的目录中保存了,下一次 ...

  10. [转]Android 导入v7包常见错误,以及项目引用v7包错误解决

    android下v4    v7   v21等包是android系统的扩展支持包,就想windows的系统补丁一个道理. android的扩展包主要是用来兼容低版本的,比如android3.0以后出现 ...