局域网主机广播寻找设备

阅读: 评论:0

局域网主机广播寻找设备

局域网主机广播寻找设备

源码及demo:UdpBroadcastSearcher

一、背景介绍

这是前面UDP网络编程中的实例(Android网络编程TCP、UDP(三)——UDP实例:搜索局域网所有的设备)。觉得这功能在以后可能会用上,就按照原思路优化了下代码。

主要优化的地方:

  • Android和Java工程中都可以使用
  • 用户可选择是否携带自定义协议数据。如设备(或主机)可以直接携带设备名称、房间等信息
  • 主机可把设备携带的信息可直接封装在设备对象中

二、原理回顾

主机与设备在同一局域网中,它们与路由器的连接为有线或无线。

实现原理:

这样就能获取到设备的IP地址,接下来就能随心所欲了,如建立TCP连接。

三、使用方法

3.1 不携带用户数据的使用(最简单的使用)

只要实现内部的抽象方法即可。

主机:

new SearcherHost() {@Overridepublic void onSearchStart() {...}@Overridepublic void onSearchFinish(Set deviceSet) {//所有设备集合都在deviceSet中,通过getIp()可获取设备IP,getPort()获取端口...}@Overridepublic void printLog(String log) {...}
}.search();

设备:

// 创建设备
SearcherDevice mSearcherDevice = new SearcherDevice() {@Overridepublic void onDeviceSearched(InetSocketAddress inetSocketAddress) {// 主机IP: Address().getHostAddress()// 主机端口&#Port()...}@Overridepublic void printLog(String s) {...}
};// 打开设备
mSearcherDevice.open();// 关闭设备
mSearcherDevice.close();

demo参考工程下的AppHost和AppDevice

3.2 携带用户数据的使用

若需要携带用户数据,必须重写类的用户数据打包与解包方法。

主机:

  1. 【可选】在构造方法中,指定泛型的具体类型。若不指定,parseUserData()也许需要强转。
  2. 在构造方法中,设置用于接收设备用户数据的最大字节长度(≥设备发送的用户数据长度)
  3. 在构造方法中,设置设备类的字节码,没有重写,则写SearcherHost.DeviceBean.class(用于内部通过反射创建实例对象)
  4. 重写两个用户数据打包方法:
    packUserData_Search()packUserData_Check()
  5. 重写用户数据解析方法:
    parseUserData(byte type, MyDevice device, byte[] userData)
SearcherHost searcherHost = new SearcherHost<MyDevice>(1024, MyDevice.class) {@Overridepublic void onSearchStart() {...}@Overridepublic void onSearchFinish(Set deviceSet) {...}@Overridepublic void printLog(String log) {...}/*** 重写以下3个方法*//*** 打包搜索时数据*/@Overrideprotected byte[] packUserData_Search() {...}/*** 打包核对时的数据*/@Overrideprotected byte[] packUserData_Check() {...}/*** 解析用户数据* @param type 类型。搜索申请or搜索确认* @param device 设备* @param userData 数据** @return true-解析成功*/@Overridepublic boolean parseUserData(byte type, MyDevice device, byte[] userData) {...}};// 开始搜索
searcherHost.search();

设备:

  1. 在构造方法中,设置用于接收设备用户数据的最大字节长度(≥主机发送的用户数据长度)
  2. 重写设备响应时的用户数据打包方法:
    packUserData()
  3. 重写用户数据解析方法:
    parseUserData(byte type, byte[] userData)
  4. 【可选】重写判断是否为本机ip地址的方法(主要用于判断主机确认返回的ip地址是否正确,默认返回true):
    isOwnIp(String ip)
SearcherDevice searcherDevice = new SearcherDevice(1024) {@Overridepublic void onDeviceSearched(InetSocketAddress inetSocketAddress) {...}@Overridepublic void printLog(String s) {...}/*** 重写以下2个方法*//*** 响应时的打包数据*/@Overrideprotected byte[] packUserData() {...}/*** 解析用户数据* @param type 类型,搜索请求or搜索确认* @param userData 用户数据* @return 解析结果是否成功*/@Overridepublic boolean parseUserData(byte type, byte[] userData) {...}/*** 判断ip是否是本机ip* @param ip 判断的ip地址* @return*/@Overridepublic boolean isOwnIp(String ip) {...}
};searcherDevice.open();

demo参考工程下的se_host和se_device。

demo中的se_host打印结果:

demo中的se_device打印结果:

本文发布于:2024-01-29 15:38:29,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170651391416303.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:局域网   主机   设备
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23