我正在构建一个多操作系统镜像系统,我想使用混合客户端-服务器和 p2p 通信方法来实现该系统(至少这是我描述它的最佳方式)。
我的问题是,在某些时候我有一个中央服务器(appengine,因此由于时间和网络能力的限制,我能做的事情受到限制),它需要向许多不同的设备发送消息,这些设备是不一定运行相同的操作系统(Windows、Android、iOS、Linux 等)。
Android 和 iOS(或任何其他移动平台)是我在两个级别上遇到的主要问题。
1 - 它们都受到电池电量的限制(比笔记本电脑和台式机根本不应该有这个问题),所以无论我使用哪种方法都需要考虑到这一点。
2 - NAT(更难,因为用户对防火墙的控制比对他们正在运行的网络的控制相对较少)。我的中央服务器将维护一个表,其中列出哪些设备具有哪些 IP 地址,但据我了解,如果有 NAT 或防火墙,如果端口未转发,它将无法访问它。
由于我将为每个操作系统编写特定的客户端,因此我更喜欢更通用的解决方案。我一直倾向于编写一个极其简单的 HTTP 服务器,它位于每个客户端上并接受请求(appengine 能够发送)并将它们视为提醒客户端执行操作的消息(无论是与服务器还是另一个客户端)。然而,我遇到了 NAT/防火墙的问题。例如,如果 appengine 需要向 AndroidDevice1 发送消息,它将从表中获取其 IP 地址并向其发出请求。但是,如果端口未正确转发,并且用户使用 3g/4g,则防火墙由数据提供商控制,这将不起作用。
因此,我开始考虑使用 Android C2DM,但我想要一个可以跨平台实现的解决方案。
我能想到的唯一其他方法是让客户端轮询服务器以获取消息。但这存在电池和网络消耗问题。
是否有任何其他方法来实现这一点,如果没有,上述哪一种方法在平衡可用性、功耗和数据消耗以及用户输入方面最好(用户为获得客户端而需要做的事情越少)设置(即端口转发等...)越好)?请注意,我并不想让这成为一场讨论/口水战,而是对事实的逻辑陈述。
提前致谢!
最佳答案
您可以创建从设备到服务器的持久 TCP 连接,然后通过此打开的连接进行通信。在大多数情况下,这将是一个非常简单的保活数据包连接。
理论上,这会通过 radio 消耗一些电池,但实际上我的经验是,电池根本没有受到太大影响。关键是将这条线路上的通信保持在最低限度。
如果 AppEngine 不允许这种方法,您可以运行自己的套接字服务器,然后使用 REST 在此服务器和 AppEngine 服务器之间进行通信。我使用的套接字服务器是 Apache MINA,在可扩展性方面没有问题。
使用此方法或任何其他方法时会遇到的另一个问题是,在 iOS 上(据我所知),当应用程序进入后台时,您无法保持 tcp 套接字打开。唯一与 iOS 设备通信的是 Apple Push Notification Service
关于android - (Android、iOS、Windows、Linux)服务器轮询、推送、实现服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9715002/