首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >(Android、iOS、Windows、Linux)服务器轮询Vs推送vs实现服务器

(Android、iOS、Windows、Linux)服务器轮询Vs推送vs实现服务器
EN

Stack Overflow用户
提问于 2012-03-15 06:34:32
回答 2查看 2.3K关注 0票数 2

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

我的问题是,在某些情况下,我有一个中央服务器(appengine,所以由于时间和网络能力的限制,我所能做的事情是有限的),它需要将消息发送到许多不同的设备,这些设备不一定运行相同的操作系统(Windows、Android、iOS、Linux等)。

安卓和iOS (或任何其他移动平台)是我在两个层次上遇到的主要问题。

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

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

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

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

我能想到的唯一其他方法就是让客户端轮询服务器上的消息。不过,这有电池和网络消耗的问题。

是否有任何其他方法来实现这一点,如果没有,在平衡可用性、电力和数据消耗以及用户输入方面,上述哪种方法是最好的(用户在设置客户端时需要做的事情越少(即端口转发等))越好)?请注意,我并不打算让这成为一场讨论/火焰之战,而是一种合乎逻辑的事实陈述。

提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-16 16:50:26

您可以创建从设备到服务器的持久TCP连接,然后通过此打开的连接进行通信。这将是一个非常简单的连接,在很大程度上具有keepalive数据包。

从理论上讲,这将消耗一些电池通过无线电,但在实践中,我经历了电池根本没有太大的影响。关键是将这条线路上的通信保持在最低限度。

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

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

票数 2
EN

Stack Overflow用户

发布于 2012-03-15 08:35:12

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9715002

复制
相关文章
克隆GitHub上项目的非Master分支
项目现在Github上有两个分支,分别是 master 和 gh-pages,其中master没什么东西,代码都在gh-pages分支上,而我现在想要克隆gh-pages分支上的东西,咋办呢?
用户8705059
2021/06/08
6800
WordPress通过分类ID获取分类名称与链接
在Wordpress主题开发的过程中,尤其是CMS主题分类的布局,通过后台选项选择分类,前台通过调用分类的ID来获取分类的名称和链接,这时我们将使用到get_cat_name()和get_category_link()两个函数,反过来也可以通过get_cat_ID()函数来获取分类ID。
.T.
2022/02/22
2.2K0
phpcms调取当前栏目的描述及当前栏目的名称
在我们填写了栏目描述,怎么调用出来。 调用文章位置导航 {catpos($catid)} 调用当前栏目链接 {$CATEGORYS[$catid][url]} 调用当前栏目名称 {$CATEGORYS[$catid][catname]} 调用当前栏目的描述调用出来 {$CATEGORYS[$catid][description]}
李维亮
2021/07/09
3.3K0
windows api学习笔记-遍历系统进程,获取进程名称和ID(进程快照)
#include <windows.h>//系统会自动连接到指定的库文件lib #include <tlhelp32.h>//声明快照函数的头文件 #include <stdio.h>//std io 标准输入输出接口 #include <iostream> using namespace std; int main() { PROCESSENTRY32 pe32; pe32.dwSize = sizeof(pe32); HANDLE hProcessSnap = ::CreateToolhel
liulun
2022/05/09
2.2K0
解读小程序的新能力---获取群ID和群名称等群信息
5月8日微信小程序有公布了一个新功能:获取群ID和群名称等群信息,官方有一句话是这么介绍它的用处的: 现在,通过最新的接口能力,开发者可以通过群ID判断用户是否来自同一个微信群,同一个群内的用户之间可
花叔
2018/04/18
3.7K0
解读小程序的新能力---获取群ID和群名称等群信息
根据 PID 获取 K8S Pod名称 - 反之 POD名称 获取 PID
随着 Kubernetes 越来越火爆,运维人员排查问题难度越来越大。比如我们收到监控报警,某台 Kubernetes Node 节点负载高。通过 top 或者 pidstat 命令获取 Pid,问题来了,这个 Pid 对应那个 Kubernetes Pod 呢?
YP小站
2020/07/21
3.4K0
django raw_id_fields 显示名称而不是id(raw_id_fields: How to show a name instead of id)
为了防止页面加载的时候加载所有的Foreignkey到内存,django提供了一个raw_id_fields,该tupple内的数据将只展示id。虽然内存不加载了,但是基本没法看。不知道是个什么东西。
obaby
2023/02/24
1.9K0
getIdentifier获取资源id
首先我想到的是反射,但是经过实验发现提示报错no emoty constructor。
提莫队长
2019/02/21
4.1K0
C++遍历文件夹从而获取指定格式或名称的文件
  本文介绍基于C++语言,遍历文件夹中的全部文件,并从中获取指定类型的文件的方法。
疯狂学习GIS
2023/06/26
9060
C++遍历文件夹从而获取指定格式或名称的文件
小程序开放微信群ID API,可获取群名称 提供个性化服务
微信方面宣布,小程序向开发者开放了群ID的接口能力。简单地说,就是当你把小程序分享在群聊中,被点击后开发者可获取群ID和群名称,也方便更好地针对群场景提供个性化服务。 群用户间可以更好地协作 大家都知
BestSDK
2018/02/28
2.9K0
小程序开放微信群ID API,可获取群名称 提供个性化服务
Python获取网卡信息(名称、MAC、
    “人生苦短,我用Python”。Python的高效有一部分是跟它丰富的模块分不开的。Python有很多第三方模块可以帮助我们完成一些事情,减少开发时间。
py3study
2020/01/03
4.7K0
Python获取网卡信息(名称、MAC、
mybatis获取update的id
平常我门都是更新数据,用更新的条件再查询一次,得到更新的记录。这样我门就进行了两次数据库操作,链接了两次数据库。增加了接口的处理事件,因为链接数据库是很耗时的操作。 其实可以通过 mybatis 的 selectKey 标签来解决这个问题。  selectKey 这个标签大家基本上都用过,比如在插入数据的时候,返回插入数据的纪录。如: <selectKey resultType="int" order="AFTER" keyProperty="id"> SELECT
似水的流年
2018/03/28
3.8K0
mybatis获取update的id
平常我门都是更新数据,用更新的条件再查询一次,得到更新的记录。这样我门就进行了两次数据库操作,链接了两次数据库。增加了接口的处理事件,因为链接数据库是很耗时的操作。
似水的流年
2018/01/25
9.3K0
mybatis获取update的id
平常我门都是更新数据,用更新的条件再查询一次,得到更新的记录。这样我门就进行了两次数据库操作,链接了两次数据库。增加了接口的处理事件,因为链接数据库是很耗时的操作。
似水的流年
2019/12/06
3.4K0
sqlite 获取最后插入id
SQLite数据库中的表均有一个特殊的rowid字段,它是一个不重复的64位有符号整数,默认起始值为1。rowid别名为oid或_rowid_,但在创建表的SQL声明语句中只能使用rowid作为关键字。如果在创建表的时候设置了类型为integer的具有自动增长性的主键,那么这时的主键相当于是rowid的别名。
随心助手
2020/06/09
6.2K0
C++ rtti vs 宏 - 如何优雅的获取类型T的name或ID
如何获取一个类型T的name或者唯一ID, 对于这个问题, 最常规的方式应该是借助C++的rtti了, 比如如ponder中所使用的方式:
fangfang
2021/10/29
2.3K0
C++ 代码 获取匹配的字符串数组或替换
C++ 代码 获取匹配的字符串数组或替换 #include <regex> #include <string> // 使用类 std::regex_iterator 来进行多次搜索. static std::string _strs = "... ..." ; std::regex _regex("<img [^>]+>"); std::cout << "sregex_iterator ====" << std::endl; auto words_begin =
用户1503405
2021/10/06
1.6K0
Java 反射获取成员变量名称
使用 Sql2o 方法读取数据库的时候,发现表名类似,但是有一些差别,如果使用 select * 方式查询,需要针对对象声明多个内容,但是实际上用的都是一样的,所以想通过获取成员变量的名称来拼接成 select 后面的内容,经过尝试,发现可以用下面的方法获取:
zucchiniy
2019/10/30
3K0
巧用vue组件实现人员id及名称的转换
我们开发时,后台很多时候都只存储一个用户Id,如创建人,修改人等,但我们前台显示时,又需要将Id转成人员名称显示。   一般很多时候在后台通过这条Id找到人名,但实际很多情况都要这么转换的,后台处理很麻烦,有没有比较通用性及简单的办法呢!    有的,我们可以考虑Vue的组件,传入一个用户Id,组件返回人名,以后就不需要再后台转换了。而且这个组件可以在页面代码上各处使用,这样比较方便! Vue组件代码如下:
星痕
2018/09/12
2.1K0
获取实体类@注解信息_jquery获取class名称
实体类打上@JsonSerialize注解 有一些表的主键是雪花生成的比较长,返回前端会出现精度损失,转成字符串返回就可以了 @JsonSerialize(using = ToStringSerializer.class)
全栈程序员站长
2022/11/16
2.2K0

相似问题

Windows2008 R2文件服务器上的DFS复制和磁盘配额

10

在Windows2008上安装node.js

10

ransomware如何删除文件服务器上的阴影副本?

20

作为文件服务器的dcpromo /forceremoval

10

在文件服务器上搜索文件

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文