(Android,iOS,Windows,Linux)服务器轮询与推送与实施服务器

时间:2012-03-15 06:34:32

标签: android ios networking push polling

我正在构建一个多操作系统镜像系统,我想使用混合客户端 - 服务器和p2p通信方法来实现(至少这是我描述它的最佳方式)。

我的问题是,在某些时候我有一个中央服务器(appengine,因此由于时间和网络能力的限制,我可以做的事情有限制)需要向一系列不同的设备发送消息不一定运行相同的操作系统(Windows,Android,iOS,Linux等)。

Android和iOS(或任何其他移动平台)是我将在2个级别上看到的主要问题。

1 - 它们都受到电池电量的限制(比笔记本电脑更多,台式电脑根本不应该有这个问题),所以无论我使用哪种方法都需要考虑到这一点。

2 - NAT(更难,因为用户对防火墙的控制比对他们正在运行的网络的控制要少)。我的中央服务器将维护一个表,其中哪个设备具有什么IP地址,但据我所知,如果有NAT或防火墙,如果没有转发端口,它将无法访问它。

由于我将为每个操作系统编写一个特定的客户端,我更喜欢更通用的解决方案。我一直倾向于编写一个非常简单的HTTP服务器,它位于每个客户端并接收请求(appengine能够发送)并将它们视为警告客户端执行操作的消息(与服务器或其他客户端一起)。但是,我遇到了NAT /防火墙的问题。例如,如果appengine需要向AndroidDevice1发送消息,它将从表中获取其IP地址并向其发出请求。但是,如果端口未正确转发,则此操作无效;如果用户使用3g / 4g,则防火墙由数据提供程序控制。

因此,我开始考虑使用Android C2DM,但我想要一个可以跨平台实现的解决方案。

我能想到的唯一其他方法是让客户端轮询服务器以获取消息。但这有电池和网络消耗问题。

是否有其他方法可以实现这一点,如果没有,上述哪种方法在平衡可用性,功耗和数据消耗以及用户输入方面最佳(用户获取客户端所需的操作越少)设置(即端口转发等)更好)?请注意,我不打算将此作为讨论/火焰战争,而是对事实的合理陈述。

提前致谢!

2 个答案:

答案 0 :(得分:2)

您可以创建从设备到服务器的持久TCP连接,然后通过此打开的连接进行通信。这大部分都是与keepalive数据包的非常简单的连接。

理论上,这会通过收音机消耗一些电池,但实际上我已经体验到电池完全没有受到太大影响。关键是要保持这条线路上的通信最小化。

如果AppEngine不允许这种方法,您可以运行自己的套接字服务器,然后使用REST在此服务器和appengine服务器之间进行通信。我使用的套接字服务器是Apache MINA,并且没有可伸缩性问题。

这种方法或任何其他方法的另一个问题是,在iOS(afaik)上,当应用程序进入后台时,您无法保持tcp套接字打开。与iOS设备通信的唯一方法是Apple推送通知服务

答案 1 :(得分:0)

我宁愿而不是HTTP连接,你应该创建TCP / IP隧道并使通信快速可靠。我有一个聊天应用程序,使用TCP / IP为我运行perfact。如果使用它,您将拥有多个平台的相同逻辑。您需要编写的只是iOS和Android的不同代码。