公网服务器与局域网手机长连接
转自:http://zhidao.baidu.com/link?url=161OQiZ7u-7Q1lfP9VbAOuAqFugPMFq889wviO-XF9I41DgTRyhk3WNGi361qM4j2lCfpX7nvvyNu3LZ1a89Xb56p3xzyN77cBn7k-oio-_
这种功能实际上就是数据同步,同时要考虑手机本身、电量、网络流量等等限制因素,所以通常在移动端上有一下两个解决方案:
1.一种是定时去server查询数据,通常是使用HTTP协议来访问web服务器,称Polling(轮询);
2.还有一种是移动端和服务器建立长连接,使用XMPP长连接,称Push(推送)。
从耗费的电量、流量和数据延迟性各方面来说,Push有明显的优势。但是使用Push的缺点是:
对于客户端:实现和维护相对成本高,在移动无线网络下维护长连接,相对有一些技术上的开发难度。
对于服务器:如何实现多核并发,cpu作业调度,数量庞大的长连接并发维护等技术,仍存在开发难点。
在讲述Push方案的原理前,我们先了解一下移动无线网络的特点。
移动无线网络的特点:
因为 IP v4 的 IP 量有限,运营商分配给手机终端的 IP 是运营商内网的 IP,手机要连接 Internet,就需要通过运营商的网关做一个网络地址转换(Network Address Translation,NAT)。简单的说运营商的网关需要维护一个外网 IP、端口到内网 IP、端口的对应关系,以确保内网的手机可以跟 Internet 的服务器通讯
GGSN(Gateway GPRS
Support Node 网关GPRS支持结点)模块就实现了NAT功能。
因为大部分移动无线网络运营商都是为了减少网关的NAT映射表的负荷,所以如果发现链路中有一段时间没有数据通讯时,会删除其对应表,造成链路中断。(关于NAT的作用及其原理可以查看我的另一篇博文:关于使用UDP(TCP)跨局域网,NAT穿透的心得)
Push在Android平台上长连接的实现:
既然我们知道我们移动端要和Internet进行通信,必须通过运营商的网关,所以,为了不让NAT映射表失效,我们需要定时向Internet发送数据,因为只是为了不然NAT映射表失效,所以只需发送长度为0的数据即可。
这时候就要用到定时器,在android系统上,定时器通常有一下两种:
1.java.util.Timer
2.android.app.AlarmManager
分析:
Timer:可以按照计划或者时间周期来执行相关的任务。但是Timer需要用WakeLock来让CPU保持唤醒状态,才能保证任务的执行,这样子会消耗大量流量;当CPU处于休眠的时候,就不能唤醒执行任务,所以应用于移动端明显是不合适。
AlarmManager:AlarmManager类是属于android系统封装好来管理RTC模块的管理类。这里就涉及到RTC模块,要更好地了解两者的区别,就要明白两者真正的区别。
RTC(Real- Time Clock)实时闹钟在一个嵌入式系统中,通常采用RTC
来提供可靠的系统时间,包括时分秒和年月日等;而且要求在系统处于关机状态下它也能够正常工作(通常采用后备电池供电),它的外围也不需要太多的辅助电路,典型的就是只需要一个高精度的32.768KHz
晶体和电阻电容等。(如果对这方面感兴趣,可以自己查阅相关资料,这里就说个大概)
好了,回来正题。所以,AlarmManager又称全局定时闹钟。这意味着,当我用使用AlarmManager来定时执行任务,CPU可以正常地休眠,只有在执行任务是,才唤醒CPU,这个过程是很短时间的。
下面简单来说明其使用:
1.类似于Timer功能:
//获得闹钟管理器
AlarmManager
am = (AlarmManager)getSystemService(ALARM_SERVICE);
//设置任务执行计划
am.setRepeating(AlarmManager.ELAPSED_REALTIME, firstTime, 5*1000,
sender);//从firstTime才开始执行,每隔5秒再执行
2.实现全局定时功能:
//获得闹钟管理器
AlarmManager
am = (AlarmManager)getSystemService(ALARM_SERVICE);
//设置任务执行计划
am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime,
5*1000, sender);//从firstTime才开始执行,每隔5秒再执行
总结:在android客户端使用Push推送时,应该使用AlarmManager来实现心跳功能,使其真正实现长连接。
得学习一下push。。。
转载于:https://www.cnblogs.com/rw-rongwei/p/4703704.html
公网服务器与局域网手机长连接相关推荐
- 无线网络玩天刀创建服务器失败,天涯明月刀手游连接服务器失败解决办法 总是掉线...
天涯明月刀手游连接服务器失败怎么办?为什么总是掉线?游戏中很多玩家发现自己玩的时候连接服务器失败,非常难受,下面由第一手游网小编为大家带来连接服务器失败解决办法吧! 天涯明月刀手游连接服务器失败解决办 ...
- RustDesk 自建服务器,局域网可以连接服务器,外网就不可以了。 求高手指点迷津。
RustDesk 自建服务器,局域网可以连接服务器,外网就不可以了. 求高手指点迷津. 局域网连接是没有问题的,但是映射到公网ip就是连不上,端口映射没有问题.有那位大神可以指点迷津用云服务器吗? 就 ...
- rustdesk RustDesk 自建服务器,局域网可以连接服务器,外网就不可以了。 求高手指点迷津。
rustdesk RustDesk 自建服务器,局域网可以连接服务器,外网就不可以了. 求高手 局域网连接是没有问题的,但是映射到公网ip就是连不上,端口映射没有问题.有那位大神可以指点迷津用云服务器 ...
- 怎样用公网连接虚拟服务器,连接公网服务器设置方法
连接公网服务器设置方法 内容精选 换一换 ENI负载均衡 ( ENI LoadBalancer )使用弹性负载均衡器直通容器,使部署在容器中的业务时延降低.性能无损耗.ELB实例创建出来后没法更改fl ...
- linux无法添加网络连接到服务器地址,ubuntu9.1服务器版局域网IP设置 网络无法连接(急)...
ubuntu9.1服务器版局域网IP设置 网络无法连接(急) 发布时间:2010-01-19 12:53:43来源:红联作者:szfhx 我的网络环境是要设置静态IP地址的 网段是192.168.2. ...
- 英雄联盟手游显示连接服务器失败,英雄联盟手游连接超时怎么办 无法登录解决方法...
LOL手游国服开启了新一轮的超燃测试,想必不少小伙伴们都拿到了此次测试的资格,不过一些小伙伴们在登录的时候却遇到了连接超时的情况,遇到英雄联盟手游连接超时怎么办?这里就来和大家分享一下连招超时.无法登 ...
- 大话2正在连接登录服务器,大话西游手游连接问题 进去没服务器怎么办
大话西游手游进去没有服务器怎么办,大话西游手游进去为什么没有服务器?服务器连接失败怎么办?小编为大家分享大话西游手游连接问题汇总,希望可以帮助到大家. 先为大家分析一下可能的原因 1.服务器维护 官方 ...
- 天刀手游服务器注册不了,《天涯明月刀》手游连接服务器失败解决办法
天涯明月刀手游连接服务器失败怎么办?为什么总是掉线?游戏中很多玩家发现自己玩的时候连接服务器失败,非常难受,下面为大家带来连接服务器失败解决办法,希望能帮助大家. <天涯明月刀>手游连接服 ...
- 手机游戏总是正在连接服务器,方舟手游服务器为什么一直显示正在连接 | 手游网游页游攻略大全...
发布时间:2015-09-27 梦幻西游手游升级过程中不少玩家会出现服务器等级限制的问题,来看看小编熊北北的梦幻西游手游服务器等级限制是什么 服务器等级限制是什么意思吧. 服务器等级限制是什么 只有当 ...
- 火影手游服务器响应超时,手游方舟为什么联机会显示连接超时 | 手游网游页游攻略大全...
发布时间:2017-09-05 大话西游手游通风幻阵太虚镜怎么连接?魔王窟新增通风幻阵副本,相信很多玩家都还没哟摸清它的套路吧!下面小编就为大家详细介绍大话西游手游通风幻阵太虚镜的连接攻略. [流程与 ...
最新文章
- jquery form 序列化
- 公有云私有云的区别_一分钟秒懂公有云、私有云、混合云的区别?
- 手把手教你写篇出彩的分析报告(万字长文):以叮咚买菜为例,看生鲜电商的春天是否已经到来?
- java中实现选择文件_Java实现选择文件并显示文件内容代码
- eclipse 全屏插件
- php中常用的全局变量有,在PHP中如何使用全局变量的方法详解
- HDU-1102-Constructing Roads(并查集)
- ASP.NET案例--新闻模块设计
- jquery中的trigger()和preventDefault()方法
- python 序列化之JSON和pickle详解
- C语言程序设计知识必备pdf,C语言程序设计基础知识要点.pdf
- E71(S60 3rd)通话录音软件 -终极录音- 的用法
- ppt菜鸟学飞第一天——基础知识及字体知识
- 华为计算机系统叫什么,华为MateBook操作系统是什么
- ESP32笔记(7) OpenSSL下载安装
- 《Python基础教程(第3版)》笔记:第8章异常
- react钩子_使用Web动画API和React钩子创建高性能动画
- Chapter_06 更改图像的对比度和亮度
- [点分树] BZOJ 4372: 烁烁的游戏
- 小程序时间戳转换成时间格式
热门文章
- unity linux桌面环境,现在仍然可以在Ubuntu 20.04上安装Unity桌面环境
- linux 按序号创建文件夹,在Linux终端中创建M3U播放列表的方法
- CPU纯软件半虚拟化技术
- 《高级无线网络—4G技术》——2.3 正交频分复用
- zipkin实战(python)
- 【.bash_profile 与 .bashrc 的区别】
- 企业启动计划预算管理的原因解析
- arpa/inet.h中定义的函数
- __setattr__,__getattr__,__delattr__
- 进程创建函数fork