我试图弄清楚如何搜索登录到在特定端口上托管应用程序的 wifi 网络的其他设备。
如何在不知道它们的地址甚至它们托管的端口的情况下检测这些其他设备的存在?
一旦发现,我应该能够联系设备并使用 SocketChannels 与它建立客户端-服务器连接。
注意:此应用程序适用于 ICS 之前的 Android 设备。所以没有Wifi-Direct。
我试图弄清楚如何搜索登录到在特定端口上托管应用程序的 wifi 网络的其他设备。
如何在不知道它们的地址甚至它们托管的端口的情况下检测这些其他设备的存在?
一旦发现,我应该能够联系设备并使用 SocketChannels 与它建立客户端-服务器连接。
注意:此应用程序适用于 ICS 之前的 Android 设备。所以没有Wifi-Direct。
您绝对可以在所有对等方侦听的众所周知的端口上发送探测数据包以广播(255.255.255.255)。这是一种易于发现的古老技术。其他包括SSDP
或UPnP
。
请注意,255.255.255.255仅适用于 UDP 广播
[添加] 我更喜欢扩展我的答案而不是评论。
您可以选择自己喜欢的广播模式。它们都是可以互换的。
模型 1 是“工作机会”,在我看来是我最喜欢的。您在您的服务器应用程序上打开一个监听套接字,然后定期发送一个广告或更好的公告广播消息,告诉每个人在某个 IP/端口(该端口不需要是静态的)有可用的开放服务。任何对通信感兴趣的对等点只需连接到指定的端点即可使用该服务。
模型 2 是“求职”,其中服务器保持沉默。当客户端想要连接时,它会广播一条通用搜索消息。任何可用的服务器都会收到该消息并回复(单播)或广播上述公告消息。
模型 2a 是“反向求职”,其中客户端广播的服务请求不是作为通用消息,而是包括其端点。服务器然后连接到客户端端点,但协议继续,因为客户端节点正在从服务器节点请求服务。它们充当反向角色 TCP 对等体。
这取决于几个因素。我无法帮助您选择最终的毫秒数,但我可以向您展示所有因素。首先,客户端应该等待多长时间才能告诉用户可用服务的扫描已“完成”?您可能会想到“立即”或“1 秒”,但请记住,根据社区中可用服务器的数量,广播数据包往往会使网络过载。
如果您选择模型 1,请尽快开始侦听可用服务(即,当应用程序启动时),然后定期从列表中删除那些在您的超时时间或时间范围内未收到心跳(广播数据包的另一个技术名称)的服务。手动扫描通常应该在或取决于有多大的范围内完成T*2
T*3
T
T*1.5
T*1.2
T