2017-05-15 34 views
0

我想在客户端 - 服务器模型中创建应用。所以我写了桌面服务器和移动客户端库。现在我遇到一些问题,从Android设备自动发现LAN网络中的PC/Mac电脑。Android:客户端 - 服务器使用TCP,并发现局域网上的PC/Mac(WiFi)

可能的解决方案:

  1. 获得Android设备的IP地址,获得子网掩码,用org.apache.commons.net.util.SubnetUtilsgetInfo().getAllAddresses()和扫描它们全部采用InetAddress.isReachable(timout=1000ms)该解决方案的工作,但如果我们有乐观的子网掩码为255.255.255.0,必须扫描254个地址,需要254秒=> 4分钟。好吧,我可以使用线程,也许增加10个线程和分裂这个任务来检查大约26个IP地址可以使其在< 45秒以下。但也可以有子网掩码255.255.0.0(不太可能,但是...)。

  2. Android没有arp -a命令行工具,但它有类似/proc/net/arp这样的文件吗?我正在阅读这个文件,并且可以非常快速地在局域网中获得一些IP地址,我可以拒绝没有真正MAC的IP地址,但是00:00:00:00:00:00。我也可以找到该设备的供应商也使用一些API,本地数据库? 问题是,我读过这个文件有一些缺陷,如包含不存在的设备(在他们断开连接后)?并非所有设备实际连接?这样对吗?所以我可以继续吗?

以上两种解决方案都只能查找IP地址,我的服务器应用的端口号是多少。好吧,我可以使用固定的端口号(但它可以被其他服务使用,然后会有问题)。也许尝试从xxxx端口号如xxxx + 1,xxxx + 2,...等连续地址到我找到一些我可以更正的时刻。所以这个连接可能需要我花费合理的时间。

  • 我已阅读关于NSD或DNS-SD: https://developer.android.com/training/connect-devices-wirelessly/nsd.html 这似乎使能寄存器某些服务(在我的情况下我的服务器侧应用程序)并使其在被发现本地网络由其他设备?这在PC/MacOS服务器应用程序注册发现的情况下是可用的,Android应用程序使用NSD找到此服务?
  • 当我有IP地址时,我如何获取设备的名称: 即此处显示的名称“Play Internet 4G ...”,这是我的无线路由器。

    enter image description here

    或在此显示

    enter image description here

    回答

    0

    我认为使用NSD(网络服务发现)实现DNS-SD(服务发现)和MacOS的(也是Windows在我的计算机的名称, iOS)Bonjour

    http://developer.apple.com/bonjour 
    

    将是在LAN中实现发现设备(由客户端 - 服务器本地网络软件提供的服务)的最佳方式。您还可以获取描述性名称,例如在该计算机上运行的计算机名称或服务器应用程序,以显示最终用户。在macOS的终端中有dns-sd命令行工具,您可以测试网络中的服务注册以及它们以后的发现。它工作得很好,而且速度很快。我的Android应用发现在macOS命令行工具中注册的服务的示例屏幕截图。

    enter image description here

    观看更多: https://developer.apple.com/videos/play/wwdc2011/211/