消息推送方案(轮询、长连接)

轮询

轮询:比较简单的,最容易理解和实现的就是客户端去服务器上拉信息,信息的及时性要求越高则拉信息的频率越高。客户端拉信息的触发可以是一些事件,也可以是一个定时器,不断地去查询服务器。所以这个方案的弊端也是显而易见的,在轮询的频率较高时,服务器端的压力很大,通讯的流量也很大,并且大部分时间都是做的无用功。

长连接

长连接:客户端和服务端维持一个长连接,服务端在有信息推送的时候,借助这个连接把信息发送到客户端。这个方案的优点是信息推送的及时性很高,基本是实时的,并且除了维持连接的心跳,不会产生额外的流量,但服务端需要维持连接,当客户端数量庞大的时候,服务器的资源消耗也会很大。本文后面提到的几个框架,都借助Java的NIO特性,缓解了服务端的压力和资源消耗,但毕竟是有连接,在性能上还是无法跟传统的HTTP无连接服务端比较。

其他

其他:在手机端,其实还可以有短信、邮件等方式,来进行信息推送。这些方式由于牵涉到运营商和手机操作系统的内置服务框架,限制较多,何况微信都要被收费,所以就不去考虑了。

开源框架(Androidpn  Openfire  MINA  Netty)

Android手机应用,信息推送的资料大多都是关于androidpn的,这是一个基于XMPP协议的Java开源信息推送方案,包括完整的服务端和客户端。服务端有Tomcat和Jetty两个版本,下载下来后配置一下数据库连接参数和IP端口就可以跑起来了。客户端则可以参考它的示例,把Android代码拿过来用即可。所以这是一个针对android应用的高度定制版,如果要对服务端进行修改调整,动的地方比较多。
Openfire则适用的范围更广,是基于XMPP协议的开源实时协作服务器,可以通过它简单地搭建一个IM平台。Androidpn是在Openfire上做了简化,只针对Android的消息推送。从这里也可看出,就消息推送来说,用XMPP协议有点杀鸡用牛刀了。
MINA和Netty是Socket框架,是同一个作者的,架构差别不大。MINA归Apache管,Openfire和Androidpn都是用的MINA;Netty则归JBOSS管,从我检索到的资料来看,更多偏向于Netty,大致是认为Netty的性能稍优,文档与例子更完整。

消息推送服务(GCM  C2DM  百度云推送)

其实也有一些现存的云推送服务可供选择,并不一定要自己来搭建一个平台。谷歌的GCM,Google Cloud Messaging,是C2DM的升级版,Android终端用的话,本来是最合适不过了,但在国内大家都懂的,玩的是《墙来了》游戏,有时你可以钻过去,有时会被撞落水,所以不靠谱啊。百度和其他的一些公司,也提供云推送服务,好像没有免费的。谷歌应该比较郁闷吧,Android上的搜索、地图、邮件、推送等等,在国内都是为他人作嫁衣裳。

回归本质-协议(TCP/IP  HTTP   XMPP   MQTT)

没想到一个消息推送可以有这么多“内涵”啊。本质上,不就是维持一个连接,服务端需要推送消息的时候就通过这些连接往客户端传信息嘛。仔细想来,要想灵活和可控,最好的方式还是自己基于TCP/IP协议来实现消息推送。再往上一点,就是在HTTP协议上来实现,这样的话既可以穿越防火墙,也可以通过AJAX实现网页上的消息推送。Servlet 3.0的异步请求支持,其实也是可以用来做消息推送的。XMPP和MQTT协议要复杂些,最好选一个开源框架来搭建。

Netty简介

Netty是一个异步的,事件驱动的网络编程框架和工具,是一个基于NIO的客户,服务器端编程框架,使用Netty可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户,服务端应用。Netty相当简化和流线化了网络应用的编程开发过程,例如,TCP和UDP的socket服务开发。

Netty下载

官网下载或者CSDN下载

Netty入门(Hello World)

在Eclipse中新建java工程,将netty.jar包放入lib目录下,然后build path -->add to build path,目录结构如下

客户端代码如下

  1. public class HelloClient {
  2. public static void main(String args[]) {
  3. // Client服务启动器
  4. ClientBootstrap bootstrap = new ClientBootstrap(new NioClientSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool()));
  5. // 设置一个处理服务端消息和各种消息事件的类(Handler)
  6. bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
  7. @Override
  8. public ChannelPipeline getPipeline() throws Exception {
  9. return Channels.pipeline(new HelloClientHandler());
  10. }
  11. });
  12. // 连接到本地的8000端口的服务端
  13. bootstrap.connect(new InetSocketAddress("127.0.0.1", 8000));
  14. }
  15. private static class HelloClientHandler extends SimpleChannelHandler {
  16. @Override
  17. public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) {
  18. System.out.println("Hello world, I'm client.");
  19. }
  20. }
  21. }

服务端代码如下

  1. public class HelloServer {
  2. public static void main(String[] args) {
  3. // Server服务启动器
  4. ServerBootstrap bootstrap = new ServerBootstrap(new NioServerSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool()));
  5. // 设置一个处理客户端消息和各种消息事件的类(Handler)
  6. bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
  7. @Override
  8. public ChannelPipeline getPipeline() throws Exception {
  9. return Channels.pipeline(new HelloServerHandler());
  10. }
  11. });
  12. // 开放8000端口供客户端访问。
  13. bootstrap.bind(new InetSocketAddress(8000));
  14. }
  15. private static class HelloServerHandler extends SimpleChannelHandler {
  16. @Override
  17. public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) {
  18. System.out.println("Hello world, I'm server.");
  19. }
  20. }
  21. }

首先运行服务端,然后运行客户端,效果如下


下面我会进一步讲解Netty的使用。

Android 基于Netty的消息推送方案之Hello World(一)的更多相关文章

  1. Android 基于Netty的消息推送方案之对象的传递(四)

    在上一篇文章中<Android 基于Netty的消息推送方案之字符串的接收和发送(三)>我们介绍了Netty的字符串传递,我们知道了Netty的消息传递都是基于流,通过ChannelBuf ...

  2. Android 基于Netty的消息推送方案之字符串的接收和发送(三)

    在上一篇文章中<Android 基于Netty的消息推送方案之概念和工作原理(二)> ,我们介绍过一些关于Netty的概念和工作原理的内容,今天我们先来介绍一个叫做ChannelBuffe ...

  3. Android 基于Netty的消息推送方案之概念和工作原理(二)

    上一篇文章中我讲述了关于消息推送的方案以及一个基于Netty实现的一个简单的Hello World,为了更好的理解Hello World中的代码,今天我来讲解一下关于Netty中一些概念和工作原理的内 ...

  4. android基于XMPP的消息推送机制

    关于服务器端向Android客户端的推送,主要有三种方式:1.客户端定时去服务端取或者保持一个长Socket,从本质讲这个不叫推送,这是去服务端拽数据.但是实现简单,主要缺点:耗电等2.Google的 ...

  5. Android 几种消息推送方案总结

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6241354.html 首先看一张国内Top500 Android应用中它们用到的第三方推送以及所占数量: 现 ...

  6. 基于SignalR的消息推送与二维码描登录实现

    1 概要说明 使用微信扫描登录相信大家都不会陌生吧,二维码与手机结合产生了不同应用场景,基于二维码的应用更是比较广泛.为了满足ios.android客户端与web短信平台的结合,特开发了基于Singl ...

  7. Knative 实战:基于 Kafka 实现消息推送

    作者 | 元毅 阿里云智能事业群高级开发工程师 导读:当前在 Knative 中已经提供了对 Kafka 事件源的支持,那么如何基于 Kafka 实现消息推送呢?本文作者将以阿里云 Kafka 产品为 ...

  8. 基于FCM的消息推送功能

    需求背景 我方项目需要支持客户端消息推送,iOS终端可以借由苹果本身的apns很方便的实现,但是对于Android来说,必须集成第三方的SDK来处理.考虑到项目需要以及成本,我们选择使用谷歌的FCM框 ...

  9. android通过服务实现消息推送

    这里运用到的andorid知识模块主要有Notification和Service,和一个android-async-http-master开源框架 android项目中,有时会有这样一种需求:客户每隔 ...

随机推荐

  1. 利用CSS实现居中对齐

    1. 文本居中 首先编写一个简单的html代码,设置一个类名为parentDiv的div对象.html代码如下: <div class="parentDiv"> 这里随 ...

  2. ASP.NET实现省市区三级联动(局部刷新)

    跟前一篇ASP.NET实现年月日三级联动(局部刷新)一样,没什么技术含量,直接上代码 <asp:ScriptManager ID="ScriptManager1" runat ...

  3. android获取在res文件下的图片资源

    //得到该图片的id(name 是该图片的名字,"drawable" 是该图片存放的目录,getPackageName()是应用程序的包) int resID = getResou ...

  4. 关于EditText组件在android4.4W中出现黄色感叹号的问题?

    今天用eclipse编写android4.4W的项目,在XML中用到了EditText组件来写文本框,结果出现了黄色感叹号,还出现一句 This text field does not specify ...

  5. pl/sql的工具导入和代码导入

    工具导入:在导入的文件中添加导入工具.导入imp:F:\app\Administrator\product\11.1.0\db_1\BIN\imp.exe导出exp:F:\app\Administra ...

  6. 异步socket大并发实现

    using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Net.So ...

  7. 极度郁闷的错误调试——ajax jquery

     今天在写一个简单邮件验证的页面时,本来以为二十分钟的事情,却调试了一个半小时,简直郁闷,具体的错误如下: 在页面中,有一段如下的代码: <td colspan="3"> ...

  8. 删除MSMQ中的消息队列时"访问被拒绝的错误"

    删除MSMQ中消息队列时出现 google之,发现也没有找到解决方法,自己在琢磨一下,一般出现这种问题的都是权限问题,因此查看了一下属性,果然如此 此消息队列是使用Windows服务创建的 解决办法: ...

  9. protocol buffer介绍(protobuf)

    一.理论概述0.参考资料入门资料:https://developers.google.com/protocol-buffers/docs/javatutorial更详细的资料:For more det ...

  10. vs code(egret wing) php配置与调试

    所需插件 下面是便于编写以及调试php的插件,可以从IDE Store中搜索. PHP Debug,PHP IntelliSense,PHP IntelliSence Cranne. 环境配置 找到项 ...