简介

Comet4J是一个微型的即时推送框架(类似于goeasy),它分为服务端与客户端两部分,你只要将服务器端(JAR文件,目前仅支持Tomcat6、7)放入WEB-INF\lib,客户端(JavaScript文件)引入到页面,那么你的应用就具备了向客户端推送信息的能力,而你仅需要在服务器端调用Comet4J所提供发送方法,信息就会被主动的推送到客户的浏览器上。

准备工作

下载服务端jar文件

Comet4J目前仅支持Tomcat6、7版本,根据您所使用的Tomcat版本下载【comet4j-tomcat6.jar】或【comet4j-tomcat7.jar】文件放置到WEB项目的WEB-INF\lib目录下。

下载客户端js文件

下载【comet4j.js】到您的项目中,比如:WebContent\js目录下。

修改服务器配置文件

因为Comet4J工作在NIO方式下,所以我们需要调整服务器连接器配置,更换为NOI连接器。 打开server.xml文件将找到原先的连接器配置:

<Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />替换为:

<Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" redirectPort="8443"/>

在web.xml中加载Comet4J框架

最后我们需要在web.xml配置侦听和comet连接地址,以使Comet4J生效:

<listener>

<description>Comet4J容器侦听</description>

<listener-class>org.comet4j.core.CometAppListener</listener-class>

</listener>

<servlet>

<description>Comet连接[默认:org.comet4j.core.CometServlet]</description>

<display-name>CometServlet</display-name>

<servlet-name>CometServlet</servlet-name>

<servlet-class>org.comet4j.core.CometServlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>CometServlet</servlet-name>

<url-pattern>/conn</url-pattern>

</servlet-mapping>这里是最小化配置,更多配置请参见【更多资料】。至此所有的准备工作已经就绪,现在让我们来开发一个HelloWorld吧!

客户端使用简介

客户端是一个JavaScript文件(comet4j-0.0.2.js),其中最重要的是JS.Connector和JS.Engine两个类。JS.Connector负责与服务器建立并保持连接,而JS.Engine类负责将服务器推送过来的消息转化为开发人员可以处理的消息事件,并分发出去,关于客户端的API请参见:http://comet4j.axiao.org:8080/comet4j/cdoc/ 。大多数情况下,我们仅需要使用JS.Engine类就可以完成多数的开发工作。

JS.Engine类是一个静态类,在一个页面中只有一个JS.Engine类的实例。它除了负责把服务器推过来的消息转化为事件分发以外,与服务器的连接与断开也由此类负责。

JS.Engine.start方法

JS.Engine.start(String str)和JS.Engine.stop(String str)分别控制连接和断开动作,start方法需要传入一个字符串参数,用来指定您配置的Comet4J连接地址。比如按前面准备工作的配置了CometServlet的地址为/conn,那么可以这样写:

JS.Engine.start('/conn');

上段代码我们让浏览器与服务器进行连接,当连接成功以后JS.Engine类会发出"start"事件,如何进行事件的处理我们稍后介绍。

JS.Engine.stop方法

我们也能够让连接断开:

JS.Engine.stop('主动断开');

上面代码我们让连接断开,并传入了一个“主动断开”这样一个断开的原因。如果您并不需要对断开的原因进行说明,也可以不传递参数:

JS.Engine.stop();

JS.Engine类的事件处理

上面我们介绍了如何使用start和stop方法来建立和断开连接,当成功建立连接已后JS.Engine会发出"start"事件,当断开后会发出“stop”事件,当收到某个通道推送过来的信息时也会发出与通道标识同名的事件。您可以事先在中使用JS.Engine.on方法来注册事件处理函数。例如:

JS.Engine.on('start',function(cId, channelList, engine){

alert('连接已建立,连接ID为:' + cId);

});

JS.Engine.on('stop',function(cause, cId, url, engine){

alert('连接已断开,连接ID为:' + cId + ',断开原因:' + cause + ',断开的连接地址:'+ url);

});

也可以将上段代码写成,下面代码与上段代码完全等效:

JS.Engine.on({

start : function(cId, channelList, engine){

alert('连接已建立,连接ID为:' + cId);

},

stop : function(cause, cId, url, engine){

alert('连接已断开,连接ID为:' + cId + ',断开原因:' + cause + ',断开的连接地址:'+ url);

}

});

接下来,介绍一下如何对服务器推送过来的消息进行处理。在介绍之前,我们假设后台已经注册了一个"hello"的应用通道标识,并且只向客户端推送简单的字符串信息。先看如下代码:

JS.Engine.on('hello',function(text){

alert(text);

});

这样当服务器端使用"hello"通道标识推送过来的消息就可以由上段代码进行处理,将推送过来的信息弹出。

特别注意:以上代码在事件处理函数中使用了alert仅为说明函数功能,实际使用中,在事件处理函数中切勿使用alert、prompt、confirm等可以中断脚本运行的函数,因为Engine需要实时的保持工作状态。

服务器端使用简介

服务端由一个Jar包组成,其中最重的是CometContext和CometEngine两个类。

CometContext 类

CometContext是一个单态类,通过其getInstance方法来获得实例,它主要负责框架的一些初始化工作保存着一些参数的配置值,除此之外它还有一个更重要的职责——负责注册应用通道标识。如果您想使用框架来实现自己的应用,那么您必需要为自己的应用分配一个唯一的通道标识,并将此通道标识在WEB容器启动时使用CometContext的registChannel方法进行注册,这样,客户端才可以正确接受此应用所推送的消息。注册一个通道标识非常简单:

CometContext.getInstance().registChannel("hello");

这样便注册了一个标识为“hello”的应用通道,而客户也可以通过JS.Engine.on('hello',function(msg){...})的形式来接收并处理来自此通道的消息。

Comet Engine 类

另一个重要的类是CometEngine,它除了负责对连接的处理之外,对于开发人员而言,更加常用的可能是它所提供的sendTo或sendToAll方法来向客户端发送消息:

String channel = "hello";

String someConnectionId = "1125-6634-888";

engine.sendToAll(channel , "我来了!");

engine.sendTo(channel , engine.getConnection(someConnectionId),“Hi,我是XXX”);

上面代码使用sendToAll方法向所有客户端在"hello"通道上发送了“我来了!”这样一条消息,然后又使用sendTo在同样的通道上向某一个连接发送了“Hi,我是XXX”消息。 CometEngine另外一个很重要的地方在于,它是框架工作的事件引擎的集散地,它提供了BeforeConnectEvent、BeforeDropEvent、ConnectEvent、DropEvent、MessageEvent等事件。通过对这些事件的处理来实现具体的功能:

class JoinListener extends ConnectListener {

@Override

public boolean handleEvent(ConnectEvent anEvent) {

CometConnection conn = anEvent.getConn();

CometContext.getInstance().getEngine().sendTo("hello", conn.getId(),"欢迎上线");

}

}

CometEngine engine = CometContext.getInstance().getEngine();

engine.addConnectListener(new JoinListener());

上面先定义了一个JoinListener并实现了父类ConnectListener的handleEvent抽像方法,然后使用engine.addConnectListener来注册这个事件侦听。这样,在有客户与服务器成功建立连接已后,就可以向此客户端推送一条欢迎信息。

161014、Comet4J介绍及使用(即时推送)的更多相关文章

  1. #研发中间件介绍#异步消息可靠推送Notify

    郑昀 基于朱传志的设计文档 最后更新于2014/11/11 关键词:异步消息.订阅者集群.可伸缩.Push模式.Pull模式 本文档适用人员:研发   电商系统为什么需要 NotifyServer? ...

  2. workman即时推送

    https://www.workerman.net/web-sender 下载源码解压后运行  start_for_win.bat  如果提示不成功,就把php路径配置到环境变量中去即可 运行后打开浏 ...

  3. ASP.NET SignaiR 实现消息的即时推送,并使用Push.js实现通知

    一.使用背景 1. SignalR是什么? ASP.NET SignalR 是为 ASP.NET 开发人员提供的一个库,可以简化开发人员将实时 Web 功能添加到应用程序的过程.实时 Web 功能是指 ...

  4. Nginx 学习笔记(十)介绍HTTP / 2服务器推送(译)

    原文地址:https://www.nginx.com/blog/nginx-1-13-9-http2-server-push/ 我们很高兴地宣布,2018年2月20日发布的NGINX 1.13.9支持 ...

  5. php 加入即时推送功能

    打开浏览器保持与服务器握手的websocket 之前用workerman接过很花时间,现在workerman对其代码做了优化->https://www.workerman.net/web-sen ...

  6. 推送_即时推送_即时通讯_在线Demo

    [伊尚]美容店(万达店)找创业合伙人(限女生) 点击查看Demo 线上预览 运行Demo截图如下: 线上预览

  7. atitit.web 推送实现方案集合

    atitit.web 推送实现方案集合 1. 俩中模式 Push/Pull 1 2. 需要实现的特性 2 2.1. 推送消息广播. 2 2.2. 推送定向消息. 2 2.3. 提供连接上线前.上线.下 ...

  8. Android客户端消息推送原理简介

    首先简单介绍一下Android消息推送的主要三种方式,如果你已经看过类似的文章,请直接忽略三种介绍.    1.使用SMS服务,即服务器端发送短信,然后手机客户端监听短信的广播,然后对数据进行一定的处 ...

  9. Android消息推送怎么实现?

    在开发Android和iPhone应用程序时,我们往往需要从服务器不定的向手机客户端即时推送各种通知消息,iPhone上已经有了比较简单的和完美的推送通知解决方案,可是Android平台上实现起来却相 ...

随机推荐

  1. jq的核心基础

    1.jq代码的风格    jq对象$().css();jQuery().css();  //获取jquery对象 示例$().css('background':'red').css('font-siz ...

  2. 官方教程:教你用好微信JS-SDK接口

    微信开放JS-SDK接口,开发者和行业用户可谓是欢欣鼓舞.奔走相告,目测将激起一大波第三方开发商的创新产品!真真是H5开发者的利好!但也有用户表示,还不了解JS-SDK接口到底是啥,究竟怎么用.现在, ...

  3. vs2010制作带卸载功能的安装包过程,及asp.net网站iis发布、备份数据库

    1:新建安装部署项目 打开VS编辑器,点击新建项目,选择:其他项目类型->安装与部署->安装项目,然后点击确定. 2 安装向导完成后即可进入项目文件夹: 双击"应用程序文件夹&q ...

  4. Java 语句总结

    一.替代if语句x = a ? b:c; 等价:if (a){ x=b;}else{x=c;}二.页面展示二维数组 <s:iterator var="rt" value=&q ...

  5. thinkphp扩展 根据前端批量建立字段

    /*批量添加字段辅助*/ function add_colum($tabel){ foreach ($_POST as $key=>$value){ $array[] = "add & ...

  6. iOS网络相关零散知识总结

    iOS网络相关零散知识总结 1. URL和HTTP知识 (1) URL的全称是Uniform Resource Locator(统一资源定位符). URL的基本格式 = 协议://主机地址/路径   ...

  7. canvas的代码封装

    (function(window,document){ var cs2d = function(selector,options){ return new cs2d.fn.init(selector, ...

  8. (Abstract Factory)抽象工厂

    定义: 抽象工厂同工厂方法有相似处:都提供了对子类创建的封装,都是有工厂方法的接口实现类的中决定了子类被创建为什么对象. 不同于工厂方法之处:工厂方法创建的对象只是一个类型的子类,而抽象工厂创建的对象 ...

  9. CRM 迁移服务器备忘

    1. 安装IIS 2. 安装sqlexpress 2005, sql management studio express 3. 安装.net framework4.0 4. 安装filezilla S ...

  10. Three.js基础探寻十——动画

    本篇将介绍如果使用Three.js进行动态画面的渲染.此外,将会介绍一个Three.js作者写的另外一个库stat.js,用来观测每秒帧数(FPS). 1.实现动画效果 1.1 动画原理 对于Thre ...