Android:使用TCP的Client-Server,以及在LAN上发现PC / Mac(WiFi)

时间:2017-05-15 06:53:53

标签: android sockets networking arp

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

可能的解决方案:

  1. 获取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(可能性较小但是......)。

  2. Android没有arp -a命令行工具,但它有/proc/net/arp个文件?我正在读取此文件,并且可以非常快地在LAN中获取一些IP地址,我可以拒绝没有真实MAC但00:00:00:00:00:00的IP地址。我还可以找到这个设备的供应商也使用一些api,本地数据库? 问题是我读过这个文件有一些缺点,比如包含不存在的设备(断开连接后)?并非所有设备实际连接?这样对吗?那我可以继续上传吗?

  3. 上述两个解决方案都只能查找IP地址,我的服务器应用程序的端口号如何。好吧我可以使用固定端口号(但它可以被其他一些服务使用,然后就会出现问题)。也许从xxxx端口号尝试连续地址,如xxxx + 1,xxxx + 2,....等等,直到我找到一些我能纠正的地址。因此,我认为连接可能需要合理的时间。

    1. 我读过有关NSD或DNS-SD的信息: https://developer.android.com/training/connect-devices-wirelessly/nsd.html 这似乎可以注册一些服务(在我的情况下是我的服务器端应用程序)并使其能够被其他设备在本地网络中发现?这是在PC / MacOS服务器应用程序注册发现和Android应用程序使用NSD查找此服务的情况下可用吗?
    2. 当我有IP地址时,如何获取设备名称: 即这里显示的名称“Play Internet 4G ...”,这是我的wifi路由器。

      enter image description here

      或此处显示的计算机名称

      enter image description here

1 个答案:

答案 0 :(得分: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/