转载地址:https://zhuanlan.zhihu.com/p/19801751

如今的手机每天都会被各种App的消息推送覆盖,消息推送也成了周末去哪儿APP增加自己曝光量的一种重要手段。消息推送的技术也日渐成熟,各种平台纷纷出现,抢占这一业务,本文就从技术角度来吐槽吐槽。本文是由我们的无线开发团队原创和整理,如果转载请务必先咨询本团队。

首先介绍下消息推送,即Push的技术基础:

什么叫Push?

真正的Push应该是只要一个Client设备连接到互联网中,什么也不做等在那里,Server端随时都可以将数据(消息是数据的一种)发送到这个Client上,就好像Server等在那里,Client随时可以访问Server一样。

用Server端做个类比,当一个Web Server在互联网上部署好以后,任何一台电脑都可以通过互联网去访问Server:从Server获取数据、向Server提交数据。向Server提交数据实际就是Client Push数据到Server。在这个模式中,Server所做的事情就是等待,等待任意的Client主动来访问它,并且不需要和Client端保持连接。Server是如何做到这点的呢,实际上是通过listen的方式,具体来说是socket的listen,Server端不需要做额外的事情,只要告诉socket,你去listen吧,有Client请求过来就交给对应的程序去完成吧,就这么简单。

Client端的Push是否能做到这点呢,我们这里只考虑Client的设备是智能机的情况,主要就是Android、iOS,还有winPhone?大概吧。Android和iOS都是基于linux系统的,有完整的网络协议架构,所以使用socket完全没有问题,winPhone作为一个智能机来说,我想也是没有问题的。所以对于这些智能机来说,让一个socket去listen,等待互联网上的任意一台其他设备来访问是可行的,Server Push数据给Client只需要去连接Client的socket就可以了。

事情是这么简单吗?显然不是,不然就不会有各个大小公司跳出来做平台了。

ps:首先我们要了解socket是什么,socket是基于tcp/ip协议的一个实现,而tcp/ip是整个互联网的协议基础。关于tcp/ip,socket具体内容不在这里赘述,不了解的可以去查相关资料。

Server端和Client端有一个很重要的区别,Server端是有固定的公网ip的,而Client端的ip不是固定的,甚至不一定具有公网ip。Client访问Server时,实际是通过ip找到Server进行访问的(域名?域名最终也是被解析成ip),有固定的公网ip才方便互联网上的其他设备来访问。而反过来Server想找某个Client时,由于Client的ip不固定,Server端是无法找到Client的。所以即使Client这里放了一个socket在listen,Server找不到Client,还是连接不上Client。

所以Client是无法使用Server的这种模式去被动接受Push的。是否有办法让Server端知道Client的ip呢,比如每次Client更换ip以后将ip发给Server?这种方法显然是成本高且不可靠的。

所以,目前的Push技术实现基本都是Client主动连接Server,钻牛角尖来讲,现在的Push其实都是伪Push。下面简单讲两种方式:

一、轮询法:

这种方法最简单,Client每过一段时间向Server请求一次数据。优缺点很明显,优点是实现简单;缺点是间隔时间不好控制,并且消耗大(电量、流量)。

二、长连接法:

还是从socket入手(又是这货?),Client使用socket连接Server,并且保持socket连接,Server随时可以通过这个socket发送数据给Client。优点:最有效,客户端设备消耗比第一种小(设备应该从系统层对socket的长连接做优化,socket链接维护成本从客户端来讲应该是小于频繁的http请求的);缺点:服务端压力大,每一个设备都需要一个socket连接。

还有一些其他协议比如xmpp,其实也逃不过上面两种方式,只是做了一些封装。或者还有一种非互联网方式的做法,比如监听短信法,要push的时候,先发一条手机到目的手机,Client监听到了标的短信,然后向Server请求数据,不过像这类剑走偏锋的方法,限制条件也很多,不是很实用。

总结一下,目前各个推送平台的实现都是基于长连接法的,如果App要自己实现推送,也是建议使用这种方式。但是如果每个App都用一个长连接,那么手机也吃不消了,所以又有一些其他技术来实现,我们下篇再讲。

App中如何实现消息推送相关推荐

  1. Worktile中的实时消息推送服务实现

    在团队协同工具worktile的使用过程中,你会发现无论是右上角的消息通知,还是在任务面板中拖动任务,还有用户的在线状态,都是实时刷新.Worktile中的推送服务是采用的是基于xmpp协议.erla ...

  2. SignalR 中丰富多彩的消息推送方式

    在上一篇 SignalR 文章中,演示了如何通过 SignalR 实现了简单的聊天室功能:本着简洁就是美的原则,这一篇我们也来聊聊在 SignalR 中的用户和组的概念,理解这些基础知识有助于更好的开 ...

  3. web中的GoEasy消息推送机制

    最近要用到消息推送机制,网上查了很多,什么websocket,pushlet,GoEasy等,最后发现还是GoEasy最简单方便,很容易入手,不到10分钟就可以进行web端的消息推送啦 话不多说,直接 ...

  4. 如何构建一套高可用的 APP 消息推送平台

    转载自  如何构建一套高可用的 APP 消息推送平台 消息推送作为移动 APP 运营中的一项关键技术,已经被越来越广泛的运用.本文追溯了推送技术的发展历史,剖析了其核心原理,并对推送服务的关键技术进行 ...

  5. php实现app消息推送

    如何用php实现APP消息推送 现在有很多的消息推送厂商,比如阿里云的消息推送,极光推送,融云的消息推送.他们的原理都是把sdk内置在app里面,达到消息推送的目的,通过一张图来了解一下,看不懂不要紧 ...

  6. Andriod之使用极光推送自定义消息打造个性的消息推送效果

    没必要重复造轮子,吸收别人的精华,站在巨人的肩膀上,才能走得更远,如果技术不能带来利润,狗屁都不如,好了,介绍下极光推送吧,我们项目里面用的是个推,先把这个极光推送的转载好,再来写个推的推送,原理差不 ...

  7. PhoneGap极光推送 cordova消息推送

    前言 说一下写这篇文章的初衷.之前做过一个APP用到了消息推送,最近这个项目又用到了推送.但是由于两个项目间隔4个多月,推送集成.使用方式等都忘了,所以当时又去看了以前项目的源码和一些推送相关的博客, ...

  8. java集成极光推送实现Android的消息推送

    1.极光推送的思路就是,每一个app都有一个AppKey和Master Secret,这两个值是唯一的,也就是用来标识App的唯一信息,具体怎么获取,去看极光推送官网文档,这里就不在讲解.我们在极光开 ...

  9. Web 实时消息推送详解

    title: Web 实时消息推送详解 category: 系统设计 head: meta name: keywords content: 消息推送,短轮询,长轮询,SSE,Websocket,MQT ...

最新文章

  1. AI一分钟 | AI机器人竟混入大学哲学课堂并顺利结业,居然无人察觉!
  2. 正则表达式获取TABLE里的内容
  3. 学习笔记Hadoop(一)—— Hadoop介绍(1)——认识大数据
  4. python 编程该看那些书籍_我用python5年后,我发现学python编程必看的三本书!
  5. Linux下使用Nexus搭建Maven私服
  6. Ubuntu使用jupyter notebook +导出PDF
  7. python 生成式,迭代器,生成器
  8. 绿得发娇的企业即时通讯软件
  9. Uber开源深度概率编程语言Pyro,AI实验室蛰伏一年首现身
  10. 文字处理技术:有哪些难点?
  11. P2525 Uim的情人节礼物·其之壱 【字典序】【STL:prev_permutation】
  12. 达梦数据库启用日志方法,达梦数据库查看日志是否启用,达梦数据库日志文件位置查找
  13. 【OBS】OBS Studio 视频录制软件 的安装
  14. html如何调用less,LESS
  15. mysql数据库备份机制_mysql备份机制有哪些
  16. 【资源下载】分享个嵌入式开发的入门教程(包含视频)
  17. PCIE实现PIO模式寄存器读写调试记录
  18. 【python教程入门学习】Python转义字符及用法
  19. html画圣诞树—动态效果展示【炫酷合集】
  20. 树立品牌价值标杆,维谛技术(Vertiv)荣膺“中国电气工业100强”殊荣

热门文章

  1. linux网卡顺序问题,linux网卡绑定及网卡顺序变更测试.docx
  2. Java堆溢出,虚拟机栈和本地方法栈溢出
  3. 解决maven dependencies xxx not found
  4. html5 漂亮的左右布局_2020年庚子年风水布局,2020年家居风水布局汇总 | 影楼
  5. Linux lvs 的固定访问
  6. EL表达式JSON应用
  7. python开发学习记录
  8. Linux常用命令之文件和目录处理命令
  9. Recurrent Neural Network系列1--RNN(循环神经网络)概述
  10. 又拍云,音视频CDN加速利器