付费下载
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】AndroidSocket发送广播包的那些坑
Socket广播包经常被用于局域网内的两台设备之间互相发现和消息传递,在Android应用开发过程中,也经常会遇到这样的需求,例如:两台Android设备之间、Android与手环等智能硬件之间、Android与Windows电脑之间等等。本文主要介绍在Android中使用Socket开发广播包程序时需要注意的编程事项,以及解决方法。首先给出一段Android发送广播包的示例代码:DatagramSocket
socket
=
new
DatagramSocket(8000);
socket.setBroadcast(true);
InetAddress
addr
=
InetAddress.getByName("55");
byte[]
buffer
=
"Hello
World".getBytes();
DatagramPacket
packet
=
new
DatagramPacket(buffer,buffer.length);
packet.setAddress(addr);
packet.setPort(8086);
socket.send(packet);下面分析其中需要注意的地方:1.不要在主线程中发送广播包当然,这个做Android开发的人应该都知道,不能在UI线程中执行任何网络访问相关的操作,由于广播包的发送也属于网络操作,因此必须放到单独的线程中执行。2.广播地址不建议使用“55”上述代码中,广播包的目标地址设置为了“55”,其实,这并不是一种推荐的做法。“55”是一种受限的广播地址,常用于在计算机不知道自己IP地址的时候发送,比如设备启动时向DHCP服务器索要地址等等,一般情况下,路由器不会转发目标为受限广播地址的广播包。而且,有些路由器/Wi-Fi热点不支持该广播地址(例如:用Android手机做Wi-Fi热点的时候),因此在程序中会出现“ENETUNREACH(Networkisunreachable)”的异常,因此,为了保证程序成功发送广播包,建议使用直接广播地址,例如:当前IP地址是00,子网掩码是的情况下,广播地址为:55,(具体的推算方法这里就不展开了,可以参考计算机网络相关书籍)。那么,如何得到本网段的直接广播地址呢,下面是stackoverflow上面有位大牛分享的代码:public
static
InetAddress
getBroadcastAddress(Context
context)
throws
UnknownHostException
{
WifiManager
wifi
=
(WifiManager)context.getSystemService(Context.WIFI_SERVICE);
DhcpInfo
dhcp
=
wifi.getDhcpInfo();
if(dhcp==null)
{
return
InetAddress.getByName("55");
}
int
broadcast
=
(dhcp.ipAddress
&
mask)
|
~mask;
byte[]
quads
=
new
byte[4];
for
(int
k
=
0;
k
<
4;
k++)
quads[k]
=
(byte)
((broadcast
>>
k
*
8)
&
0xFF);
return
InetAddress.getByAddress(quads);
}直接使用该函数即可得到正确的“广播地址”,通过setAddress函数设置到DatagramPacket对象中即可。3.Android设置为Wi-Fi热点时的广播地址这是个比较大的坑,当Android设备被设置为Wi-Fi热点的时候,上面的函数得到的地址是"",因此,我们需要探究当Android设备被设置为Wi-Fi热点的时候,它的IP地址究竟是多少?有人研究了Android底层源码发现,当Android设备被设置为Wi-Fi热点的时候,其IP地址是hardcode写死在源码中的,地址是:“”,对应的广播地址是:"55"为此,我们需要写个函数来判断一下当前Android手机是否处于Wi-Fi热点模式下,如果是,则应该使用上面给出的这个广播地址,这里给出代码示例:protected
static
Boolean
isWifiApEnabled(Context
context)
{
try
{
WifiManager
manager
=
(WifiManager)context.getSystemService(Context.WIFI_SERVICE);
Method
method
=
manager.getClass().getMethod("isWifiApEnabled");
return
(Boolean)method.invoke(manager);
}
catch
(NoSuchMethodException
e)
{
e.printStackTrace();
}
catch
(IllegalAccessException
|
IllegalArgumentException
|
InvocationTargetException
e)
{
e.printStackTrace();
}
return
false;
}AndroidSDK并没有开放判断是否处于热点模式的API,因此,我们需要通过反射的方式来得到,另外,注意添加权限:
<uses-permission
android:name="android.permission.ACCESS_WIFI_STATE"
/>4.小结本文涉及到的代码被封装到了一个Broadcaster.java的文件中,可以在博文最后的附件中下载,也可以从下面的地址下载:/Jhuster
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 湖北省黄冈市麻城市顺河镇重点达标名校2026年学业水平考试生物试题含解析
- 2026年食品与饮品行业绿色包装选型指南与合规要求
- 河北省临城县重点中学2026届初三3月质检化学试题试卷含解析
- 日照市重点名校2026年高频错题卷(五)生物试题含解析
- 2026年大班幼儿任务意识与时间观念培养方案
- 2026年612老旧小区“微更新 海绵化”省级示范项目解析
- 2026年阿蒙森海海洋生态系统关键要素调查方案
- 航空业飞行经理面试技巧
- 电力行业技术人才选拔标准
- 人力资源公司招聘顾问的面试技巧及常见问题
- 【新教材】统编版(2024)小学三年级语文下册第6课《会摇尾巴的狼》教案(教学设计)
- 2025至20303D打印行业市场发展分析及前景趋势与投融资发展机会研究报告
- 企业知识管理系统功能需求分析
- 护士分层培训考核制度
- 潜水泵维修培训课件
- 大学生就业指导(第4版 实践版)课件全套 陈叙龙 第1-10章 剖析就业形势与政策 -大学生就业与创业案例分析
- 冷却塔水泵机组更换施工方案
- 昏迷恢复量表CRS-R使用指南
- Premiere题库资料完整版
- 医院中层干部选拔任用工作方案
- 2026年佳木斯职业学院单招综合素质笔试备考题库带答案解析
评论
0/150
提交评论