我需要能够发现本地网络上的服务(比如说我正在运行一个聊天应用程序,我想发现本地网络上运行这个聊天的其他设备),但遗憾的是我需要能够使用它在 API < 16 的设备上(所以我不能使用 android.net.nsd)我确信这可以在不使用 NSD API 的情况下完成。问题是如何。有帮助吗?
最佳答案
至少有三四个选项。
你可以使用
TCP 或 UDP
- 广播地址
- 多播地址
- 遍历网络中的所有地址
HTTP
4 使用外部服务器或类似 GCM (Google Cloud Messaging) 的东西
广告 1 和 2
优点:
+易于实现,服务器在特定端口上的子网/网络的广播/多播地址上发送预定义的“hello”消息,客户端正在监听该端口,当“hello”消息到达时,他会自动知道服务器 IP 地址(包含在数据包中)
+不需要连接到互联网
缺点:
- 一些公共(public)网络会阻止此地址以避免攻击(例如泛洪)。
广告 3。
优点:
当多播和广播被阻止时,您可以做的只是遍历整个子网。这是一种“强力”方法,但有效,尤其是在掩码为/24 的典型家庭/小型网络上——只有 255 个地址可以迭代。
也不需要连接到互联网
缺点
当掩码设为/16 时,迭代所有 IP 将花费相当多的时间
会导调用池耗尽
并且会淹没网络。
广告。 4
另一种方法是制作一些外部服务器作为设备的“定位点”。他们每个人都发送自己的地址,并查看是否有来自同一网络的其他设备的一些条目。
当然需要互联网连接。
因此,我认为从广播和多播开始是个好主意,因为它非常简单并且可以在很多地方使用,但请记住,有些网络不允许使用它。
可以在这里找到很好的引用 http://docs.oracle.com/javase/tutorial/networking/datagrams/broadcasting.html
关于API 14 之前的 Android 网络发现服务 (ish),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14007372/