我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android推送技术研究

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android推送技术研究

  前言   近研究Android推送的实现, 研究了两天一夜, 有了一点收获, 写下来既为了分享, 也为了吐槽. 需要说明的是有些东西偏底层硬件和通信行业, 我对这些一窍不通, 只能说说自己的理解.   为什么要研究Android推送技术? 主要还是毕业设计要做一个即时通信app, 我是不喜欢做什么社交app的, 也象牙塔里的人想得出来, 说实话有这功夫还不如钻研一个小技术点, 把一个点研究透彻, 比搞个大而全, 还无用的东西好得多, 不过谁叫咱们是普通人, 没得选呢.   Android推送服务的几种实现方式   现实生活中, 推送服务像订杂志一样, 只要留下你的地址, 杂志能如期送到你手里, 可以认为每个人都有的一个地址, 但在目前的网络上, 这是办不到的, 因为不是每个人都有一个的地址, 服务器想要给我们推送一条消息, 必须知道我们的地址, 但服务器不知道我们在哪.   说到推送服务, 我所知道的实现方案有如下几种:   轮询   客户端定期询问服务器有没有新的消息, 这样服务器不用管客户端的地址是什么, 客户端来问, 直接告诉它行.   这种方案简单, 对于一些不追求实时性的客户端来说, 很适合, 只需要把时间间隔设定成几个小时取一次, 能很方便的解决问题.   但对于即时通讯产品来说, 这种方案完全不能用. 假设即时通讯软件在网络畅通的情况下发送的消息要求对方10s内能收到, 如果用轮询, 那么客户端要每隔5s连一次服务器, 如果在移动端, 手机的电量和流量很快会被消耗殆尽.   SMS通知   这种方案在移动端是有可能的, 让客户端拦截手机短信, 服务器在有新消息时给用户的手机号发一条特殊的短信, 客户端拦截短信后发现是正常短信放行, 如果是特殊短信连接服务器取消息.   运营商不会配合, 用户也不会放心, 这方案普通公司玩不起.   长连接   这大概是目前情况下佳的方案了, 客户端主动和服务器建立TCP长连接之后, 客户端定期向服务器发送心跳包, 有消息的时候, 服务器直接通过这个已经建立好的TCP连接通知客户端.   XMPP, MQTT等不算推送技术   在网上搜索资料的时候, 经常看见XMPP协议实现的Android推送和MQTT协议实现的Android推送, 我个人觉得这两种说法都怪怪的, XMPP和MQTT二者都是协议, 尽管我不清楚严格来讲这俩协议工作在哪一层, 但是是在传输层之上的, 姑且认为他俩在TCP/IP五层模型的应用层吧, 闭口不提传输层的实现, 而是扯应用层, 这种说法真是令我费解, 所以我个人认为XMPP, MQTT等等不算推送技术.   关于这个XMPP, 我想很多人都是参考Openfire和Smack那套东西, 我一年前尝试用aSmack和Openfire做IM, 不过那个时候什么都不懂, 做的东西很烂, 懂的是Openfire这东西相当老了, 我看有一些开源的推送解决方案都是在这套东西的基础上改的, 想想这工作量, 挺可怕的.   细说TCP长连接与心跳   长连接方案乍一听怪怪的, 什么是长连接? 定时发送心跳, 这和轮询有什么区别? 心跳是干什么的? 同样是定期和服务器沟通, 为什么长连接比轮询更加? 手机休眠了TCP连接不会断掉吗?   这是我在刚开始研究推送技术的时候的问题, 虽然有些还是没有很准确的答案, 但了解的大概可以分享一下, 有什么错误欢迎指出.   什么是长连接   先说短连接, 短连接是通讯双方有数据交互时建立一个连接, 数据发送完成后,则断开此连接.

  persistent connection

  长连接是大家建立连接之后, 不主动断开. 双方互相发送数据, 发完了也不主动断开连接, 之后有需要发送的数据继续通过这个连接发送.   TCP连接在默认的情况下是所谓的长连接, 也是说连接双方都不主动关闭连接, 这个连接应该一直存在.   但是网络中的情况是复杂的, 这个连接可能会被切断. 比如客户端到服务器的链路因为故障断了, 或者服务器宕机了, 或者是你家网线被人剪了, 这些都是一些莫名其妙的导致连接被切断的因素, 还有几种比较特殊的:   NAT超时   因为IPv4地址不足, 或者我们想通过无线路由器上网, 我们的设备可能会处在一个NAT设备的后面, 生活中常见的NAT设备是家用路由器.   NAT设备会在IP封包通过设备时修改源/目的IP地址. 对于家用路由器来说, 使用的是网络地址端口转换(NAPT), 它不仅改IP, 还修改TCP和UDP协议的端口号, 这样能让内网中的设备共用同一个外网IP. 举个例子, NAPT维护一个类似下表的NAT表          内网地址                 外网地址   192.168.0.2:5566 120.132.92.21:9200   192.168.0.3:7788 120.132.92.21:9201   192.168.0.3:8888 120.132.92.21:9202   NAT设备会根据NAT表对出去和进来的数据做修改, 比如将192.168.0.3:8888发出去的封包改成120.132.92.21:9202, 外部认为他们是在和120.132.92.21:9202通信. 同时NAT设备会将120.132.92.21:9202收到的封包的IP和端口改成192.168.0.3:8888, 再发给内网的主机, 这样内部和外部能双向通信了, 但如果其中192.168.0.3:8888 == 120.132.92.21:9202这一映射因为某些原因被NAT设备淘汰了, 那么外部设备无法直接与192.168.0.3:8888通信了.   我们的设备经常是处在NAT设备的后面, 比如在大学里的校园网, 查一下自己分配到的IP, 其实是内网IP, 表明我们在NAT设备后面, 如果我们在寝室再接个路由器, 那么我们发出的数据包会多经过一次NAT.   国内移动无线网络运营商在链路上一段时间内没有数据通讯后, 会淘汰NAT表中的对应项, 造成链路中断.   网络状态切换   手机网络和WIFI网络切换, 网络断开和连上等情况, 也会使长连接断开. 这里原因可能比较多, 但结果无非是IP变了, 或者被系统通知连接断了.   DHCP的租期   目前测试发现安卓系统对DHCP的处理有Bug, DHCP租期到了不会主动续约并且会继续使用过期IP, 这个问题会造成TCP长连接偶然的断连.   引自Android微信智能心跳方案   心跳包的作用   网上很多文章介绍长连接的时候都说:   因为是长连接, 所以需要定期发送心跳包.   心跳包是用来通知服务器客户端当前状态.   提出这些说法的人其实自己也是一知半解. 这些说法其实都对, 但是没有答到点上. 好像别人问: “你为什么要去食堂”? 这人回答: “检查自己还能不能找到食堂”. 这个答案说不上错了, 但是其实这人是去食堂吃饭的, 证明自己认得路只是个附赠品.   明确一点, TCP长连接本质上不需要心跳包来维持, 大家可以试一试, 让两台电脑连上同一个wifi, 然后让其中一台做服务器, 另一台用一个普通的没有设置KeepAlive的Socket连上服务器, 只要两台电脑别断网, 路由器也别断电, DHCP正常续租, 这么放着, 过几个小时再用其中一台电脑通过之前建立的TCP连接给另一台发消息, 另一台肯定能收到.


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android推送技术研究

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android推送技术研究

前言近研究Android推送的实现, 研究了两天一夜, 有了一点收获, 写下来既为了分享, 也为了吐槽. 需要说明的是有些东西偏底层硬件和通信行业, 我对这些一窍不通, 只能说说自己的理解.为什么要研究Android推送技术? 主要还是毕业
2022-06-06

Android、iOS和Windows Phone中的推送技术

推送并不是什么新技术,这种技术在互联网时代已经很流行了。只是随着进入移动互联网时代,推送技术显得更加重要。因为在智能手机中,推送从某种程度上,可以取代使用多年的短信,而且与短信相比,还可以向用户展示更多的信息(如图像、表格、声音等)。推送技
2022-06-06

深入研究 PHP Session 跨域技术

摘要:随着互联网的发展,跨域技术变得越来越重要。本文将深入研究PHP Session 跨域技术,并提供具体的代码示例,以帮助读者更好地理解和应用。引言在互联网应用中,跨域技术是非常必要的。当一个网站的前端需要访问另一个网站的数据时,由于浏览
2023-10-21

云服务器密码机技术研究

云服务器密码机技术主要分为两种:基于硬件的密码机和基于软件的密码机。基于硬件的密码机是在云服务器上部署硬件密码机,通过网络将密码机连接到云服务器上,从而实现密码的加密存储和传输。硬件密码机通常包括密码生成模块、密码存储模块、密码加密模块和密码解密模块等。基于软件的密码机是在云服务器上部署软件密码机,通过软件来实现密码的加密存储和传输。软件密码机可以采用LotusSoftAltairPKCS#8、ApacheSolr等开...
2023-10-27

Android、iOS和Windows Phone中的推送技术详解

推送并不是什么新技术,这种技术在互联网时代就已经很流行了。只是随着进入移动互联网时代,推送技术显得更加重要。因为在智能手机中,推送从某种程度上,可以取代使用多年的短信,而且与短信相比,还可以向用户展示更多的信息(如图像、表格、声音等)。 推
2022-06-06

共同研究Cisco交换机集群的技术

  交换机集群是两台或两台以上的交换机通过一定的方式相互连接的方式。那么问题就来了?大家知道什么叫做Cisco交换机集群技术呢?有兴趣的朋友可以跟着小编一起来学习一下:共同研究Cisco交换机集群的技术。  一、简介Cisco交换机集群  那么对于交换机之间的连接,大家都应该有较为熟悉的方法吧。最常见最普遍的主要有两种
共同研究Cisco交换机集群的技术
2024-04-18

CAD系统与PDM系统集成技术研究

1.1 系统集成技术在工程设计中,设计人员在产品设计过程中主要使用的工具软件就是CAD类软件,电器产品的设计更是离不开CAD技术,CAD技术在电器产品开发和设计中的应用十分广泛,电器行业在CAD工具的帮助下产品研发及生产效率得到了很大的提高
2023-06-05

Golang在区块链技术领域的应用研究

区块链技术作为一种分布式账本技术,近年来备受关注。它的核心思想是通过去中心化的方式实现安全的数据存储与传输。而Golang则是一种由Google设计的编程语言,具有高效、简洁、并发等特点,适合于处理大规模的数据处理和并发请求。本文将探讨Go
Golang在区块链技术领域的应用研究
2024-02-26

深入研究编码器的精确定位技术

深入探讨编码器的绝对定位方法,需要具体代码示例摘要:编码器是一种用于测量电机转动位置和速度的重要装置。在许多应用领域,如机械工程、机器人和自动化系统等,精确的位置控制和定位至关重要。本文将深入探讨编码器的绝对定位方法,并提供具体的代码示例
深入研究编码器的精确定位技术
2024-01-18

深入研究:Sybase和Oracle数据库的技术对比

Sybase和Oracle是两个常见的关系型数据库管理系统,它们在企业领域被广泛应用。本文将深入研究Sybase和Oracle数据库的技术对比,包括各自的优势、劣势和适用场景,并给出具体的代码示例进行比较。一、Sybase数据库Syba
深入研究:Sybase和Oracle数据库的技术对比
2024-03-08

服务器推送技术怎么应用

服务器推送技术是指服务器向客户端主动发送数据的技术,与传统的客户端请求-服务器响应模式不同。它可以提高应用程序的实时性、性能和用户体验,常用于实时通信、新闻推送、股票行情等场景。以下是服务器推送技术的应用举例:1. 实时通信:聊天室、在线客
2023-06-07

深入研究:Go语言项目开发的技术细节

深入研究:Go语言项目开发的技术细节Go语言(又称Golang)是谷歌公司推出的一种编程语言,它以简洁高效、并发安全、内存管理自动化等特点受到广泛关注和使用。在近年来,Go语言在用户界面开发、网络编程、分布式系统等领域都呈现出强大的优势。本
深入研究:Go语言项目开发的技术细节
2023-11-02

深入研究:Go语言项目开发的技术难题

深入研究:Go语言项目开发的技术难题引言:随着互联网技术的发展,Go语言(也称为Golang)作为一种开源的静态强类型编程语言,逐渐受到开发者的关注和青睐。由于其简洁、高效、可维护性强等特点,越来越多的项目使用Go语言进行开发。然而,随之而
深入研究:Go语言项目开发的技术难题
2023-11-02

深入研究golang中的Select Channels Go并发式编程技术

在Go语言中,使用select关键字可以实现并发式编程技术。select语句用于选择准备好进行通信的通道操作,可以同时等待多个通道操作。它可以用于解决并发编程中的各种问题,如超时处理、取消操作等。在使用select语句时,可以在每个case
2023-10-08

MongoDB技术开发中遇到的索引调优问题研究

MongoDB技术开发中遇到的索引调优问题研究摘要:索引是数据库性能优化的关键要素之一。在MongoDB技术开发中,索引的设计和调优对于提高查询性能和降低系统负载非常关键。本文将探讨在MongoDB技术开发中遇到的索引调优问题,并提供具体的
2023-10-22

研究静态重定位技术之瓶颈及应对策略

静态重定位是一种将系统中的程序和数据移动到另一个内存地址的技术。它广泛应用于操作系统、编译器和软件开发中,以确保程序能够正常执行。然而,在实际应用过程中,静态重定位技术存在一些瓶颈问题,需要寻找解决方案来提高其效率和可靠性。首先,静态重定
研究静态重定位技术之瓶颈及应对策略
2024-01-29

深入研究PHP缓存技术:加速网站性能的关键

PHP缓存技术探索:提升网站性能的利器,需要具体代码示例引言:在当今互联网的高速发展下,网站性能对于用户体验和搜索引擎排名至关重要。而PHP作为一种常用的编程语言于网站开发中广泛应用,如何提升PHP网站的性能成为了开发者们迫切探索的问题。
深入研究PHP缓存技术:加速网站性能的关键
2024-01-23

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录