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