需要有关使用 Java 或 android 在 LAN 内进行可靠数据广播的建议

Posted

技术标签:

【中文标题】需要有关使用 Java 或 android 在 LAN 内进行可靠数据广播的建议【英文标题】:Need suggestions for reliable data broadcasting inside LAN using Java or android 【发布时间】:2015-12-21 10:12:46 【问题描述】:

我们正在开发一个满足以下要求的 android 项目。

应用程序应该能够将数据发送到所有运行我们应用程序的设备,这些设备存在于 WiFi LAN 中。 一些负载的大小预计 >= 5MB。 数据不应该丢失,如果丢失,客户端应该知道失败。 所有设备都应该能够与所有其他设备通信。不会有针对特定设备的消息,而是所有消息都应该到达 N/W 中的所有设备。 没有互联网,因此没有远程服务器。

我们所做的研究:-

UDP 广播 - UDP 不保证消息传递,但在我们的案例中这是一个主要要求。因此不是一个选择。

TCP - TCP 保证消息的传递,但要求事先知道接收方的 IP 地址,在我们的例子中,我们需要将消息发送到 LAN 内的所有设备。因此不是一个直接的选择。

我们正在研究的解决方案:-

混合方法 - 将 N/W 中的一个设备命名为服务器。将所有消息发布到本地服务器。服务器为所有设备(具有我们的应用程序)保持一个打开的套接字,当有来自设备的消息时,它将消息路由到所有设备。这种方法的缺点是,

具有多个套接字的服务器为每个设备打开每个套接字。但在我们的例子中,我们期望 LAN 中有 使用连续 UDP 广播的服务器发现。 我们希望拥有所有设备中的所有数据。因此,如果我们将任何设备新引入 LAN,则该设备需要从服务器获取所有数据。

所以我的问题是,您有没有研究过这种混合方法?或者你能建议任何其他方法吗?

【问题讨论】:

【参考方案1】:

您的混合方法是可行的方法。

将您的问题清晰地拆分为多个部分并独立解决:

发现:设备需要能够发现服务器(如果有的话)。 选择服务器:决定您的哪些设备承担服务器角色。 服务器实现:服务器将所有数据分发到所有设备,并根据需要发送通知。推送或拉取通知无关紧要。 客户端实现:客户端只与服务器对话。包含服务器的设备还应该包含一个普通客户端,可能会直接将数据传递给服务器,但使用相同的抽象协议。

您可以使用 mDNS(又名 Bonjour 或 zeroconf)进行发现,但我什至不建议这样做。它通常会产生比解决的问题更多的问题,而且它不能解决您的“我需要一台服务器”的问题。我建议你为发现手工制作一个简单的 UDP 广播协议,它已经告诉你服务器是谁,如果有的话。

选择服务器:一种方法是使用您拥有的网络元数据,例如“使用具有最高 IP 地址的设备”。这通常比花哨的仲裁算法效果更好。建立服务器后,新设备将使用它,而不是切换服务器角色。

使用 UDP 广播进行发现,手动启发式重复。没有花哨的逻辑,只是让你的协议对重复的数据包有弹性并重复你的数据包。 (无论如何,您的 WLAN 路由器可能会在您不知情的情况下重复您的数据包。)

您可能希望每个客户端使用两个 TCP 连接,可能连接到两个不同的服务器端口,但这并不重要:一个控制连接(总是非常灵敏,没有大量数据,每条消息只有几百字节)和一个数据连接(对于大部分数据,您的 > 5 MB 块)。这是为了让一切都保持响应。

【讨论】:

感谢@Overmann 的快速回复。我刚刚开始实施原型应用程序作为概念证明。我将在这里发布最终状态。 酷,期待。很酷的东西!

以上是关于需要有关使用 Java 或 android 在 LAN 内进行可靠数据广播的建议的主要内容,如果未能解决你的问题,请参考以下文章

在哪里可以找到有关 Android 的“服务调用”shell 命令的信息?

在哪里可以找到有关创建自定义 android 锁屏的示例或教程?

在电脑上android l for nexus 5怎么安装

Android 使用 BluetoothGattServer

有关g++的Xlinker选项

Java学习问题记录