2

我需要能够发现本地网络上的服务(假设我正在运行一个聊天应用程序,并且我想发现本地网络上运行此聊天的其他设备),但遗憾的是我需要能够在设备上使用它API < 16(所以我不能使用 android.net.nsd) 我确信这可以在不使用 NSD API 的情况下完成。问题是如何。有什么帮助吗?

4

1 回答 1

11

至少有三四个选项。

您可以使用

TCP 或 UDP

  1. 广播地址
  2. 组播地址
  3. 遍历网络中的所有地址

HTTP

4 利用外部服务器或 GCM(谷歌云消息)之类的东西

广告 1 和 2

优点:

+易于实现,服务器在特定端口上的子网/网络的广播/多播地址上发送预定义的“hello”消息,客户端正在侦听该端口,当“hello”消息到达时,他会自动知道服务器 IP 地址(包含在包)

+不需要连接到互联网

缺点:

  • 一些公共网络会阻止此地址以避免攻击(例如泛洪)。

广告 3。

优点:

当组播和广播被阻止时,您可以做的只是遍历整个子网。这是“蛮力”方法,但有效,特别是在掩码为 /24 的典型家庭/小型网络上 - 只有 255 个地址可以迭代。

也不需要连接到互联网

缺点

当使用掩码 /16 时,迭代所有 IP 将花费大量时间

会导致电池耗尽

并将淹没网络。

广告。4

另一种方法是制作一些外部服务器,作为设备的“定位点”。他们每个人都发送自己的地址,并查看是否有来自同一网络的其他设备的一些条目。

当然需要互联网连接。

所以,我认为从广播和多播开始是个好主意,因为它非常简单并且可以在很多地方工作,但请记住,有些网络是不允许使用的。

可以在这里找到很好的参考http://docs.oracle.com/javase/tutorial/networking/datagrams/broadcasting.html

您还应该检查这个http://home.heeere.com/tech-androidjmdns.html

于 2012-12-23T01:28:04.210 回答