我正在构建一个多操作系统镜像系统,我希望使用混合的客户端-服务器和p2p通信方法来实现它(至少这是我描述它的最好方式)。
我的问题是,在某些情况下,我有一个中央服务器(appengine,所以由于时间和网络能力的限制,我所能做的事情是有限的),它需要将消息发送到许多不同的设备,这些设备不一定运行相同的操作系统(Windows、Android、iOS、Linux等)。
安卓和iOS (或任何其他移动平台)是我在两个层次上遇到的主要问题。
1-它们都受到电池电量的限制(比笔记本电脑和台式机更多),所以无论我使用哪种方法,都需要考虑到这一点。
2- NAT (更难,因为用户对其防火墙的控制相对较少,而不是在他们正在运行的网络上)。我的中央服务器将维护一个表,记录哪个设备有什么IP地址,但据我所知,如果有NAT或防火墙,如果端口没有转发,它将无法访问它。
由于我将为每个操作系统编写特定的客户端,因此我更喜欢更通用的解决方案。我一直倾向于编写一个非常简单的HTTP服务器,它位于每个客户端上,接受请求( appengine能够发送),并将它们视为警告客户端执行操作的消息(与服务器或另一个客户端)。然而,我遇到了NAT/防火墙的问题。例如,如果appengine需要向AndroidDevice1发送消息,它将从表中获取其IP地址并向其发出请求。然而,如果端口转发不正确,并且如果用户在3g/4g上,防火墙由数据提供商控制,则此方法不起作用。
正因为如此,我开始考虑使用Android C2DM,但我想要一个可以跨平台实现的解决方案。
我能想到的唯一其他方法就是让客户端轮询服务器上的消息。不过,这有电池和网络消耗的问题。
是否有任何其他方法来实现这一点,如果没有,在平衡可用性、电力和数据消耗以及用户输入方面,上述哪种方法是最好的(用户在设置客户端时需要做的事情越少(即端口转发等))越好)?请注意,我并不打算让这成为一场讨论/火焰之战,而是一种合乎逻辑的事实陈述。
提前感谢!
发布于 2012-03-16 16:50:26
您可以创建从设备到服务器的持久TCP连接,然后通过此打开的连接进行通信。这将是一个非常简单的连接,在很大程度上具有keepalive数据包。
从理论上讲,这将消耗一些电池通过无线电,但在实践中,我经历了电池根本没有太大的影响。关键是将这条线路上的通信保持在最低限度。
如果AppEngine不允许这种方法,您可以运行自己的套接字服务器,然后使用REST在此服务器和appengine服务器之间通信。我使用的套接字服务器是Apache MINA,在可伸缩性方面没有任何问题。
使用这种方法或任何其他方法都会遇到的另一个问题是,在iOS (afaik)上,当应用程序进入后台时,您不能保持tcp套接字打开。唯一能与iOS设备通信的是苹果推送通知服务
发布于 2012-03-15 08:35:12
我更喜欢,而不是HTTP连接,您应该创建TCP/IP隧道,并使通信快速和可靠。我有一个聊天应用程序,它为我运行使用TCP/IP。如果你使用它,你将在多个平台上拥有相同的逻辑。你只需要为iOS和安卓编写不同的代码。
https://stackoverflow.com/questions/9715002
复制