API 14 之前的 Android 网络发现服务 (ish)

标签 android networking discovery

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

最佳答案

至少有三四个选项。

你可以使用

TCP 或 UDP

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

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

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

关于API 14 之前的 Android 网络发现服务 (ish),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14007372/

相关文章:

unity3d - 在新的 Unity 网络中进行 "direct"RPC 样式调用?

c# - WCF 和服务发现超时

web-services - 是否有任何可用的公共(public) UDDI 注册中心?

java - 为 WebView 设置怪癖

android - 安全 - 移动设备(Android 和 iOS)是否阻止/丢弃 ICMP ECHO 请求?

c++ - 当禁用路由器上的 DHCP 时,以太网模块 ENC28C60 无法连接到互联网

c - Arduino 处理开放网络套接字

Java网络发现

android - 如何检测歌曲播放完成?

android - 在 Android Studio 中加载插件时发现问题