【问题标题】:TCP Client/Server vs Multicast broadcastTCP 客户端/服务器与多播广播
【发布时间】:2012-07-18 23:40:12
【问题描述】:

我正在开发一个无市场应用程序,它在 20-30 个 android 设备上运行(目标特定于具有 android 蜂窝/ICS OS 的平板电脑)通过本地 WIFI 网络保持连接 1-2 小时,并且需要在它们之间交换数据(表示命令的简单对象)。

大多数情况下,一个特定的平板电脑的行为类似于发送命令的服务器,而其他设备则类似于接收命令的客户端,但“客户端”有时也会向“服务器”发送命令。

作为这种通信需求的解决方案 - 我使用了一段时间的开源
封装 TCP 客户端/服务器协议的库,称为 - Kryonet。 我发现它非常易于使用,并且基本上可以完成这项工作,尽管它有时“不稳定” - 会产生很多断开连接。 我无法承受这种断开连接,它会破坏整个流程和用例,导致客户端丢失命令。

我正在做一些恢复逻辑,重新连接客户端并向他们发送他们错过的内容,但这对于用例来说还不够好。

最近我听说了多播广播协议,甚至发现了一个开源库调用 - JGroups,它以最佳方式实现了该协议,并提供了简单易用的接口。仍然没有尝试过,但是从知道的人那里得到了建议,说对于我的目的来说,TCP 客户端/服务器应该更好。

  • 我应该使用什么最佳方法来实现我所描述的行为? (不一定是我建议的两个之一)

TIA

【问题讨论】:

    标签: android tcp multicast android-wifi local-network


    【解决方案1】:

    尽管 JGroups 有望为您的情况提供更好的解决方案,但您可能需要进行更多试验以确定发生断开连接的原因。由于您的客户端和服务器都是平板电脑,因此还有一些其他不相关的原因:

    1) 如果连接没有在Service 中维护,那么默认情况下它们将非常不可靠。 (请参阅 this question 关于在 Android 中销毁单例)

    2) 如果套接字尚未设置为“keepalive”,那么它们将在任意秒数后超时。

    3) 您使用的设备在进入睡眠状态时可能会关闭一些持久连接。

    4) 平板电脑可能正在退出 WiFi 范围,并切换到移动网络。

    在许多台式机上尝试您的代码的网络部分,以确定问题出在 Kryonet 或您的代码上,还是出在 Android 上运行。

    【讨论】:

    • 你肯定提出了一些重要的观点。其中一些已经出现在我的脑海中,并且这些天一直在调查。关于 (1) - 为什么在 android 的 Service 类中保存 kryo 的 Server 类的实例应该比在我创建的其他单音类中保存更好?
    • Service 类(以及清单中的相关条目,以及使用Intent 实际启动服务)比Activity(最顶层的单位)具有更持久的优先级。 UI 交互)。如果您的应用程序只包含Activitys,那么它可能会在没有 UI 可显示时终止或暂停。即使您的应用程序不在前台,服务也可以使您的进程保持活动状态。
    • 首先——非常感谢你的帮助,关于(2)——我该如何设置这个“keepalive”的东西?你知道任何好的指南/链接来解释如何在 android 中正确使用 kryo 吗?
    • 我对 Kryonet 不够熟悉,无法给你一个很好的答案(虽然,Connection 类似乎有一个setKeepAliveTCP 方法)。如果您还没有开始使用 Android 服务,这听起来可能不是问题,或者至少是另一天的问题。
    • 其实我几天前就已经开始重构所有代码,并将kryo的Client和Server类以及回调移动到android的Services中。我这样做是出于其他原因,所以我很高兴在这里它也有助于通信稳定性问题。我现在正在阅读 - setKeepAliveTCP() 方法。感觉有点愚蠢,我以前没想过..
    猜你喜欢
    • 1970-01-01
    • 2015-06-19
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    • 1970-01-01
    • 2012-01-25
    • 2016-02-24
    • 1970-01-01
    相关资源
    最近更新 更多