昆山网站建设费用,网站建设几大类型,楼市最新消息:2023年房价走势,大气集团网站模板转载地址#xff1a;http://blog.csdn.net/q376420785/article/details/8653958 前言#xff1a;现在的大多数移动端应用都有实时得到消息的能力#xff0c;简单来说#xff0c;有发送消息的主动权和接受消息的被动权。例如#xff1a;微信#xff0c;QQ#xff0c;天气… 转载地址http://blog.csdn.net/q376420785/article/details/8653958 前言现在的大多数移动端应用都有实时得到消息的能力简单来说有发送消息的主动权和接受消息的被动权。例如微信QQ天气预报等等相信好处和用户体验相信大家都知道吧。 提出问题这种功能必须涉及client客户端和server服务器所以到底client如何和server实现实时连接通讯 分析问题这种功能实际上就是数据同步同时要考虑手机本身、电量、网络流量等等限制因素所以通常在移动端上有一下两个解决方案: 1.一种是定时去server查询数据通常是使用HTTP协议来访问web服务器称Polling轮询 2.还有一种是移动端和服务器建立长连接使用XMPP长连接称Push推送。按照本人理解客户端的实现时 while(true) { request(timeout); request(timeout); } 客户端发出一个“长”请求如果服务器发送消息或者时间out了客户端就断开这个请求再建立一个长请求 从耗费的电量、流量和数据延迟性各方面来说Push有明显的优势。但是使用Push的缺点是 对于客户端实现和维护相对成本高在移动无线网络下维护长连接相对有一些技术上的开发难度。 对于服务器如何实现多核并发cpu作业调度数量庞大的长连接并发维护等技术仍存在开发难点。 在讲述Push方案的原理前我们先了解一下移动无线网络的特点。 移动无线网络的特点 因为 IP v4 的 IP 量有限运营商分配给手机终端的 IP 是运营商内网的 IP手机要连接 Internet就需要通过运营商的网关做一个网络地址转换Network Address TranslationNAT。简单的说运营商的网关需要维护一个外网 IP、端口到内网 IP、端口的对应关系以确保内网的手机可以跟 Internet 的服务器通讯 原理图如下 GGSNGateway 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处于休眠的时候就不能唤醒执行任务所以应用于移动端明显是不合适。 AlarmManagerAlarmManager类是属于android系统封装好来管理RTC模块的管理类。这里就涉及到RTC模块要更好地了解两者的区别就要明白两者真正的区别。 RTCReal- 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来实现心跳功能使其真正实现长连接。 在服务器端的实现 在服务器端可以使用很多语言来实现如C/C,java,Erlang等等如我们国内比较好的极光推送C开发,openfire(java开发)等等。 最近我看了极光推送的介绍和原理下面我就说说他们是遇到什么难题然后使用什么技术或者方案来解决呢。 当有大量的手机终端需要与服务器维持长连接时对服务器的设计会是一个很大的挑战。 假设一台服务器维护10万个长连接当有1000万用户量时需要有多达100台的服务器来维护这些用户的长连接这里还不算用于做备份的服务器这将会是一个巨大的成本问题。那就需要我们尽可能提高单台服务器接入用户的量也就是业界已经讨论很久了的 C10K 问题。 C2000K 针对这个问题他们专门成立了一个项目命名为C2000K顾名思义他们的目标是单机维持200万个长连接。最终他们采用了多消息循环、异步非阻塞的模型在一台双核、24G内存的服务器上实现峰值维持超过300万个长连接。 最后总结 因为我最近用java在做一个PC、服务器、android的即时通讯系统说白了就是模仿QQ后面希望有不同的功能。我的原则是用别人的原理自己来实现这样才更好深入了解一些框架。所以估计难点是在通讯开发和服务器上的开发必须深刻了解多消息循环、异步非阻塞的模型。之后我会发表关于这方面的实现。 在现在的android平台上已经不是android单机的世界了我不是说做单机游戏没有前途。现在都是依靠发展蓬勃的互联网来支撑整个IT体系所以要成为一个android应用开发高手必须朝着android、硬件、云服务这一体系来发展。