需要使用 Java 或 android 在局域网内进行可靠数据广播的建议
Need suggestions for reliable data broadcasting inside LAN using Java or android
我们正在开发具有以下要求的 Android 项目。
- 应用程序应该能够向所有设备发送数据,这些设备是 运行 我们的应用程序存在于 WiFi LAN 中。
- 一些负载的大小预计 >= 5MB。
- 数据不应丢失,如果丢失,客户端应该知道失败。
- 所有设备都应该能够与所有其他设备通信。不会有针对特定设备的消息,而是所有消息都应该到达 N/W 中的所有设备。
- 没有互联网因此没有远程服务器。
我们做过的研究:-
UDP 广播 - UDP 不保证消息传递,但这是我们案例中的主要要求。因此不是一个选项。
TCP - TCP 保证消息传递,但需要事先知道接收方 IP 地址,在我们的例子中,我们需要将消息发送到 LAN 内的所有设备。因此不是一个直接的选择。
我们正在研究的解决方案:-
混合方法 - 将 N/W 中的其中一台设备命名为服务器。 Post 将所有消息发送到本地服务器。服务器为所有设备(具有我们的应用程序)保持打开的套接字,当有来自设备的消息时,它会将消息路由到所有设备。这种方法的缺点是,
- 每个设备打开多个套接字的服务器。但在我们的例子中,我们期望 LAN 中的设备 <=5。
- 使用连续 UDP 广播发现服务器。
- 我们想要所有设备中的所有数据。因此,如果我们新引入任何设备到局域网中,那么该设备需要从服务器获取所有数据。
所以我的问题是,您有没有研究过这些混合方法?或者你能建议任何其他方法吗?
您的混合方法是正确的选择。
将你的问题干净利落地拆分成多个部分并独立解决它们:
- 发现:设备需要能够发现服务器(如果有的话)。
- Select 服务器:决定您的哪些设备承担服务器角色。
- 服务器实现:服务器将所有数据分发到所有设备并在必要时发送通知。推送或拉取通知并不重要。
- 客户端实现:客户端只与服务器对话。包含服务器的设备也应该包含一个普通的客户端,可能直接将数据传递给服务器,但使用相同的抽象协议。
您可以使用 mDNS(又名 Bonjour 或 zeroconf)进行发现,但我什至不推荐这样做。它制造的问题往往多于解决的问题,而且它不能解决您的 'I need one server' 问题。我建议你为发现手工制作一个简单的 UDP 广播协议,它已经告诉你服务器是谁,如果有的话。
Select服务器:一种方法是使用您拥有的网络元数据,例如'use the device with the highest IP address'。这通常比花哨的仲裁算法更有效。建立服务器后,新设备将使用它,而不是切换服务器角色。
使用 UDP 广播进行发现,手动启发式重复。没有花哨的逻辑,只是让你的协议对重复的数据包具有弹性并重复你的数据包。 (无论如何,您的 WLAN 路由器可能会在您不知情的情况下重复您的数据包。)
您可能希望每个客户端使用两个 TCP 连接,可能连接到两个不同的服务器端口,但这无关紧要:一个控制连接(总是非常灵敏,数据量不大,每个只有几百字节)消息)和一个数据连接(对于大部分数据,您的 > 5 MB 块)。这样一切都保持响应。
我们正在开发具有以下要求的 Android 项目。
- 应用程序应该能够向所有设备发送数据,这些设备是 运行 我们的应用程序存在于 WiFi LAN 中。
- 一些负载的大小预计 >= 5MB。
- 数据不应丢失,如果丢失,客户端应该知道失败。
- 所有设备都应该能够与所有其他设备通信。不会有针对特定设备的消息,而是所有消息都应该到达 N/W 中的所有设备。
- 没有互联网因此没有远程服务器。
我们做过的研究:-
UDP 广播 - UDP 不保证消息传递,但这是我们案例中的主要要求。因此不是一个选项。
TCP - TCP 保证消息传递,但需要事先知道接收方 IP 地址,在我们的例子中,我们需要将消息发送到 LAN 内的所有设备。因此不是一个直接的选择。
我们正在研究的解决方案:-
混合方法 - 将 N/W 中的其中一台设备命名为服务器。 Post 将所有消息发送到本地服务器。服务器为所有设备(具有我们的应用程序)保持打开的套接字,当有来自设备的消息时,它会将消息路由到所有设备。这种方法的缺点是,
- 每个设备打开多个套接字的服务器。但在我们的例子中,我们期望 LAN 中的设备 <=5。
- 使用连续 UDP 广播发现服务器。
- 我们想要所有设备中的所有数据。因此,如果我们新引入任何设备到局域网中,那么该设备需要从服务器获取所有数据。
所以我的问题是,您有没有研究过这些混合方法?或者你能建议任何其他方法吗?
您的混合方法是正确的选择。
将你的问题干净利落地拆分成多个部分并独立解决它们:
- 发现:设备需要能够发现服务器(如果有的话)。
- Select 服务器:决定您的哪些设备承担服务器角色。
- 服务器实现:服务器将所有数据分发到所有设备并在必要时发送通知。推送或拉取通知并不重要。
- 客户端实现:客户端只与服务器对话。包含服务器的设备也应该包含一个普通的客户端,可能直接将数据传递给服务器,但使用相同的抽象协议。
您可以使用 mDNS(又名 Bonjour 或 zeroconf)进行发现,但我什至不推荐这样做。它制造的问题往往多于解决的问题,而且它不能解决您的 'I need one server' 问题。我建议你为发现手工制作一个简单的 UDP 广播协议,它已经告诉你服务器是谁,如果有的话。
Select服务器:一种方法是使用您拥有的网络元数据,例如'use the device with the highest IP address'。这通常比花哨的仲裁算法更有效。建立服务器后,新设备将使用它,而不是切换服务器角色。
使用 UDP 广播进行发现,手动启发式重复。没有花哨的逻辑,只是让你的协议对重复的数据包具有弹性并重复你的数据包。 (无论如何,您的 WLAN 路由器可能会在您不知情的情况下重复您的数据包。)
您可能希望每个客户端使用两个 TCP 连接,可能连接到两个不同的服务器端口,但这无关紧要:一个控制连接(总是非常灵敏,数据量不大,每个只有几百字节)消息)和一个数据连接(对于大部分数据,您的 > 5 MB 块)。这样一切都保持响应。