我想在客户端 - 服务器模型中创建应用程序。所以我写了桌面服务器和移动客户端库。现在我遇到一些问题,从Android设备自动发现局域网中的PC / Mac电脑。
可能的解决方案:
获取android设备的ip地址,获取子网掩码,使用org.apache.commons.net.util.SubnetUtils
类到getInfo().getAllAddresses()
并使用InetAddress.isReachable(timout=1000ms)
扫描它们这个解决方案有效,但是如果我们有乐观的子网掩码255.255 .255.0它必须扫描254个地址,它需要254秒=&gt; &GT; 4分钟。好吧我可以使用线程,可能添加10个线程并拆分此任务以检查大约26个IP地址可以使其低于<45秒。但是也可以有子网掩码255.255.0.0(可能性较小但是......)。
Android没有arp -a
命令行工具,但它有/proc/net/arp
个文件?我正在读取此文件,并且可以非常快地在LAN中获取一些IP地址,我可以拒绝没有真实MAC但00:00:00:00:00:00
的IP地址。我还可以找到这个设备的供应商也使用一些api,本地数据库?
问题是我读过这个文件有一些缺点,比如包含不存在的设备(断开连接后)?并非所有设备实际连接?这样对吗?那我可以继续上传吗?
上述两个解决方案都只能查找IP地址,我的服务器应用程序的端口号如何。好吧我可以使用固定端口号(但它可以被其他一些服务使用,然后就会出现问题)。也许从xxxx端口号尝试连续地址,如xxxx + 1,xxxx + 2,....等等,直到我找到一些我能纠正的地址。因此,我认为连接可能需要合理的时间。
当我有IP地址时,如何获取设备名称: 即这里显示的名称“Play Internet 4G ...”,这是我的wifi路由器。
或此处显示的计算机名称
答案 0 :(得分:0)
我认为使用NSD
(网络服务发现)实施DNS-SD
(服务发现)和MacOS(也适用于Windows,iOS) Bonjour
http://developer.apple.com/bonjour
将是在LAN中实现设备发现(客户端 - 服务器本地网络软件提供的服务)的最佳方式。您还可以获得描述性名称,例如计算机名称或在该计算机上运行的服务器应用程序,以显示最终用户。在macOS上的终端中有dns-sd命令行工具,你可以测试网络中服务的注册及其后来的发现。它运行得非常好,速度很快。我的Android应用程序发现服务在macOS命令行工具中注册的示例屏幕截图。