TCP客户端/服务器与多播广播

3
我正在开发一个非市场应用程序,它在20-30个Android设备上运行(针对具有Android Honeycomb / ICS操作系统的平板电脑),在本地WIFI网络上保持连接1-2小时,并且需要在这些设备之间交换数据(表示命令的简单对象)。
大部分时间,一个特定的平板电脑像一个服务器一样发送指令,其他设备像客户端一样接收指令,但“客户端”有时也会向“服务器”发送指令。
为了解决这种通信需求 - 我使用了一个称为Kryonet的封装TCP客户端/服务器协议的开源库。我发现使用起来非常容易,并且基本上可以胜任工作,但有时会不稳定 - 经常出现断开连接。我无法承受这种断开连接,因为它破坏了整个流程和用例,导致客户端丢失命令。
我正在实施一些恢复逻辑,重新连接客户端并发送它们错过的内容,但对于这种用例来说还不够好。
最近,我听说了多播广播协议,并找到了一个名为JGroups的开源库,它优化了此协议,并公开了易于使用的接口。虽然我还没有尝试过它,但从了解它的人那里得到了建议,说它应该比TCP客户端/服务器更好地适用于我的目的。
问题:我应该使用什么最佳方法来实现我描述的行为?(不一定是我建议的两种方法之一)
谢谢。
1个回答

3
尽管JGroups在您的情况下可能是更好的解决方案,但您可能需要进行更多实验以确定为什么会出现连接断开的问题。由于您的客户端和服务器都是平板电脑,存在一些与之无关的其他原因:
1)如果连接没有在Service中维护,则默认情况下它们将非常不可靠。(请参见有关Android中单例被销毁的这个问题
2)如果未将套接字设置为“keepalive”,则它们将在任意秒数后超时。
3)您正在使用的设备在进入睡眠状态时可能会关闭某些持久连接。
4)平板电脑可能已经超出了WiFi范围,并切换到移动网络。
尝试在几台桌面机上运行您的代码的网络部分,以确定问题是由Kryonet还是由您的代码引起的,或者问题是否在Android上运行。

1
你肯定提出了一些重要的观点。其中一些已经在我的脑海中,我最近一直在调查。关于(1)-为什么将kryo的Server类的实例放在android的Service类内部比放在我创建的其他单例类内部更好? - Tal Kanel
2
Service类(以及清单中的相关条目,以及使用Intent实际启动服务)比Activity(UI交互的最高单元)具有更持久的优先级。如果您的应用程序仅包含Activity,则在没有UI可显示时,它可能会被终止或暂停。即使您的应用程序不在前台,服务也可以保持进程活动状态。 - Greyson
首先,非常感谢您的帮助。关于(2)- 我该如何设置这个“keepalive”?您知道任何好的指南/链接可以解释如何正确地在Android中使用Kryo吗? - Tal Kanel
我对Kryonet不够熟悉,无法给您一个好的答案(尽管,Connection类似乎有一个setKeepAliveTCP方法)。如果您还没有开始使用Android服务,那么这似乎可能不是个问题,或者至少是另一天的问题。 - Greyson
实际上,我几天前已经开始重构所有的代码,并将kryo的Client和Server类以及回调函数移动到了Android的Services中。我之所以这样做是出于其他原因,所以很高兴听到它也可以解决通信稳定性问题。我现在正在阅读关于setKeepAliveTCP()方法的内容。感觉有点愚蠢,之前没有考虑到这一点... - Tal Kanel
如果您对导致我的断开连接的其他原因有任何想法,我很乐意听取。 - Tal Kanel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接