cometd入门

最近工作原因,需要研究客户端推技术,客户端推有3种方式,HTTP streaming、LONG POLLING以及ajax轮询。

 

ajax轮询:ajax轮询只是感官的推,是通过客户端不断请求响应实现。

HTTP streaming:客户端与服务端建立连接,当服务端收到请求时,往客户端推送消息,此时客户端状态为3即reading状态,非4完成。

LONG POLLING:即长轮询,客户端与服务端建立连接,当服务端收到请求时,往客户端推送消息,此时客户端状态为4即完成,客户端处理消息后,再往服务端发送请求。

 

 

首先,什么cometd?使用ajax作为web应用的服务器推技术称为"Comet",cometd是一个提供多种开发语言的Bayeux项目,由dojo项目基金会支持。Bayeux是一种在客户端和服务端之间传输的消息协议(基于HTTP),cometd的消息都是基于Bayeux协议。

cometd作为客户端推技术使用LONG POLLING方式,该技术核心为continuation+beyeux+jquery-cometAPI

 

continuation:即servlet服务端端多线程技术,在发起request请求后,HttpServlet对象不会阻塞,而是新开启一个线程等待事件被触发,当事件到来时再进行响应

 

Beyeux: 支持使用ajax的客户端与服务器端之间灵敏、快速的信息交互。类似于jms订阅机制

 

jquery-cometdAPI:封装了cometd客户端的api

 

 

 

 

好了,废号少说,开发我们的cometd之旅

 

一、安装demo

1.下载java1.5以上版本,tomcat6以上,安装、配置环境变量。。。。。不用多说吧

2.下载cometd-demo,我用的是6.1.26版本,http://dist.codehaus.org/jetty/jetty-6.1.26/

   注意:如果没有使用servlet3.0,请不要到cometd官网下载,而是到jetty官网下载,否则下载demo不能正常运行

3.jetty-6.1.26.zip解压,找到jetty-6.1.26\webapps\cometd.war包,将该war放到tomcat的webapps下面

4.运行demo,启动tomcat后,登录到http://127.0.0.1:8080/cometd/,选择jquery中的chat & XD,进入到聊天室界面。你可以同时打开几个窗口进行聊天了。

 

现在demo运行成功,直观的感觉有了,下一步,我们继续深入学习代码部分。

 

 

 

二、研究demo中的有效信息

解压war包,删除暂时不需要的东东,保留红圈的部分(使用jquery作为例子讲解)。下图是目录结构(注意:此处是翻译后导入到eclipse的工程结构,怎么导不用多说了吧)

 

导入到eclipse后的目录结构(需要反编译class)

 

1.先查看web.xml,通过此项配置,我们可以看到,通过cometd/*的请求是由cometd自带api的servlet进行处理,换句说说,聊天信息的提交和发布非自行编写而是统一进行处理。先不要急,后面会慢慢讲到,包括初始化的servlet-CometdDemoServlet

 

 

<context-param>
        <param-name>org.mortbay.jetty.servlet.ManagedAttributes</param-name>
        <param-value>org.cometd.bayeux,dojox.cometd.bayeux</param-value>
    </context-param>

    <servlet>
        <servlet-name>cometd</servlet-name>
        <servlet-class>org.mortbay.cometd.continuation.ContinuationCometdServlet</servlet-class>
        <init-param>
            <param-name>filters</param-name>
            <param-value>/WEB-INF/filters.json</param-value>
        </init-param>
        <init-param>
            <param-name>timeout</param-name>
            <param-value>120000</param-value>
        </init-param>
        <init-param>
            <param-name>interval</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>maxInterval</param-name>
            <param-value>10000</param-value>
        </init-param>
        <init-param>
            <param-name>maxLazyLatency</param-name>
            <param-value>5000</param-value>
        </init-param>
        <init-param>
            <param-name>multiFrameInterval</param-name>
            <param-value>2000</param-value>
        </init-param>
        <init-param>
            <param-name>logLevel</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>jsonDebug</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>cometd</servlet-name>
        <url-pattern>/cometd/*</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>cometdDemo</servlet-name>
        <servlet-class>org.cometd.demo.CometdDemoServlet</servlet-class>
        <load-on-startup>2</load-on-startup>
    </servlet>

 

 2.再查看jquery-examples\chat\chat.js,找到join方法,这下稍微清楚一点了吧。

     首先配置URL请求,再建立握手,此时准备工作已经做好了,再看看下一段代码

 

this.join = function(username)
{
	//省去一部分....
	//生成url,正好的web.xml配置的servlet
	var cometdURL = location.protocol + "//" + location.host + config.contextPath + "/cometd";
	//省去一部分....

	//配置URL
	$.cometd.configure({
		url: cometdURL,
		logLevel: 'debug'
	});
			
	//建立握手
	$.cometd.handshake();
	//省去一部分....
};

 

 

 

     订阅主题的方法,此方法的功能是:订阅名称为/chat/demo的主题,当该主题产生消息时,调用receive方法

function _subscribe()
{
	//订阅主题,并制定回调方法
	_chatSubscription = $.cometd.subscribe('/chat/demo', _self.receive);
	_membersSubscription = $.cometd.subscribe('/chat/members', _self.members);
}

 

 

 

 receive回调方法,message可以为text或者json格式

this.receive = function(message)
{
	/* 接收参数 */
	var fromUser = message.data.user;
	var membership = message.data.membership;
	var text = message.data.chat;
	
	/* 执行下一步操作*/
	//...省略

	chat.append('<span class=\"membership\"><span class=\"from\">' + fromUser + '&nbsp;</span><span class=\"text\">' + text + '</span></span><br/>');
	_lastUser = null;
	//...省略
};

 

 

再看看发送消息的方法吧,找到

 

 

Jetty 欢迎访问Jetty文档 Wiki. Jetty是一个开源项目,提供了http服务器、http客户端和java servlet容器。 这个wiki提供jetty的入门教程、基础配置、功能特性、优化、安全、JavaEE、监控、常见问题、故障排除帮助等等。它包含教程、使用手册、视频、特征描述、参考资料以及常见问题。 Jetty文档 ---------------- 入门: 下载Download, 安装, 配置, 运行 Jetty入门(视频) 下载和安装Jetty 如何安装一个Jetty包 如何配置Jetty – 主要文档 如何运行Jetty 用JConsole监控Jetty 如何使用Jetty开发 Jetty HelloWorld教程 Jetty和Maven HelloWorld教程 Jetty(6)入门 (www.itjungle.com) Jetty Start.jar 配置Jetty 如何设置上下文(Context Path) 如何知道使用了那些jar包 如何配置SSL 如何使用非root用户监听80端口 如何配置连接器(Connectors) 如何配置虚拟主机(Virtual Hosts) 如何配置会话ID(Session IDs) 如何序列化会话(Session) 如何重定向或移动应用(Context) 如何让一个应用响应一个特定端口 使用JNDI 使用JNDI 在JNDI中配置数据源(DataSource) 内嵌Jetty服务器 内嵌Jetty教程 内嵌Jetty的HelloWorld教程 内嵌Jetty视频 优化Jetty 如何配置垃圾收集 如何配置以支持高负载 在Jetty中部署应用 部署管理器 部署绑定 热部署 Context提供者 如何部署web应用 webApp提供者 如何部署第三方产品 部署展开形式的web应用 使用Jetty进行开发 如何使用Jetty进行开发 如何编写Jetty中的Handlers 使用构建工具 如何在Maven中使用Jetty 如何在Ant中使用Jetty Maven和Ant的更多支持 Jetty Maven插件(Plugin) Jetty Jspc Maven插件(Plugin) Maven web应用工程原型 Ant Jetty插件(Plugin) 使用集成开发环境(IDEs) 在Eclipse中使用Jetty 在IntelliJ中使用Jetty 在Eclipse中工作 在Eclipse中开发Jetty Jetty WTP插件(Plugin) JettyOSGi SDK for Eclipse-PDE EclipseRT Jetty StarterKit SDK OSGi Jetty on OSGi, RFC66 基于Jetty OSGi的产品 OSGi贴士 Equinox中使用Jetty实现HTTP Service Felix中使用Jetty实现HTTP Service PAX中使用Jetty实现HTTP Srevice ProSyst mBedded Server Equinox Edition Spring Dynamic Modules里的Jetty JOnAS5里的Jetty 配置Ajax、Comet和异步Servlets 持续和异步Servlets 100 Continue和102 Processing WebSocket Servlet 异步的REST Stress Testing CometD 使用Servlets和Filters Jetty中绑定的Servlets Quality of Service Filter Cross Origin Filter 配置安全策略(Security Policies) 安全领域(Security Realms) 安全域配置教程 Java Authentication and Authorization Service (JAAS) JAAS配置教程 JASPI 安全模型(Secure Mode) 存储在文件中的安全密码以及编程教程 如何开启或禁止Jetty中的SSL功能 如何在Jetty中安全存储密码 如何安全终止Jetty 如何配置Spnego Application Server Integrations(集成) Apache Geronimo JEE 配置Apache httpd和Jetty教程 配置Apache mod_proxy和Jetty 配置Jetty中的AJP13 在JBoss中配置Jetty Remote Glassfish EJBs from Jetty Jetty and Spring EJB3 (Pitchfork) JBoss EJB3 ObjectWeb EasyBeans
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值