android - (Android、iOS、Windows、Linux)服务器轮询、推送、实现服务器

标签 android ios networking push polling

我正在构建一个多操作系统镜像系统,我想使用混合客户端-服务器和 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/

相关文章:

iOS : Share with UIActivityViewController & Default applications

c - 连接到环回地址时的管道损坏 (EPIPE)

ios - 访问web时,block和不block有什么区别

networking - SSH 连接隧道被拒绝

android - 有没有机会让键盘显示在标签图标上

java - 如果语句不能正常工作

android - 如何确定正在使用哪个值文件夹

java - 无法实例化服务 - Java.NullPointerException

ios - 如何使用 SwiftUI 扩展按钮的宽度

ios - 如何得到类似苹果 map 状态栏的模糊效果?