`
hsabby
  • 浏览: 20991 次
社区版块
存档分类
最新评论
  • Rainyn: 作者写的很好。有完整项目实例吗?这个是跑在tomcat还是je ...
    初识cometd
  • hwfrog: 这个没有看过具体的源码,猜测的,因为init是所有用户进程的父 ...
    inittab的使用
  • hwfrog: 确实简单,这个感觉和RCP很类似,RMI在某些地方还是有一定的 ...
    Java的RMI初探
  • hwfrog: 不错, 学习了; 这段时间也想研究一下源码, 多交流
    初识cometd
  • hwfrog: 后面准备总结一下java的接口和内部类; 请博主多关注哈
    Java访问修饰符

初识cometd

 
阅读更多

<!--defaultCSS-->

 
1、项目的基本介绍
官方的解释是一个HTTP事件驱动框架。我没明白这个是什么意思,当前研究它,就是想看看它的消息推送功能。从我的角度看,cometd提供了一套搭建推送消息的框架,既包括server部分,也包括client部分。使用它,我们能够方便、快速的搭建起我们的消息推送系统。
 
2、搭建demo
demo基本介绍:搭建cometd server,开发publish和subscribe消息的客户端,并测试发布和订阅消息
 
1)从cometd-2.6.0-RC1\cometd-java\cometd-java-examples\target\cometd-java-examples-2.6.0-RC1.war包中获取全部依赖的lib库
 
2)创建web工程,用于部署cometd的server服务。
对于我们的demo测试程序,web工程创建好后,不需要写任何代码,只需要配置好web.xml文件,样例如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">
    <servlet>
        <servlet-name>cometd</servlet-name>
        <servlet-class>org.cometd.server.CometdServlet</servlet-class>
        <init-param>
            <param-name>timeout</param-name>
            <param-value>60000</param-value>
        </init-param>
        <init-param>
            <param-name>logLevel</param-name>
            <param-value>3</param-value>
        </init-param>
<init-param>
            <param-name>transports</param-name>
            <param-value>org.cometd.server.transport.JSONTransport,org.cometd.websocket.server.WebSocketTransport</param-value>
        </init-param>
        <init-param>
            <param-name>allowedTransports</param-name>
            <param-value>org.cometd.server.transport.JSONTransport,org.cometd.websocket.server.WebSocketTransport</param-value>
        </init-param>
         <load-on-startup>1</load-on-startup>
         <async-supported>true</async-supported>
    </servlet>
    <servlet-mapping>
        <servlet-name>cometd</servlet-name>
        <url-pattern>/CometDServerDemo/*</url-pattern>
    </servlet-mapping>
<!--   <filter>
        <filter-name>cross-origin</filter-name>
        <filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class>
        <async-supported>true</async-supported>
    </filter>
    <filter-mapping>
        <filter-name>cross-origin</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping> -->
    
<!--     <servlet>
        <servlet-name>configuration</servlet-name>
        <servlet-class>com.hisense.abby.cometd.demo.ConfigurationServlet</servlet-class>
        <load-on-startup>2</load-on-startup>
    </servlet> -->
</web-app>
 
说明:web.xml中只需要定义一个servlet就可以了;对应的class是cometd提供的类org.cometd.server.CometdServlet。需要注意的是,我们配置的url-pattern是/CometDServerDemo/*,如果配置为/*的话,握手和心跳消息都正常,但是publish消息到server的时候,会得到HTTP 302的错误码,具体原因暂时不清楚。需要特别说明的是,<async-supported>true</async-supported>这个配置项必须要有,否则启动的时候会报 !AsyncSupported的错误,表示server当前不支持异步处理。如果配置了filter,则filter中也需要添加上这个配置。
 
3)创建普通java工程,模拟客户端订阅和发布消息
无论是发布消息还是订阅消息,都需要先和服务端握手成功:
Map<String, Object> options = new HashMap<String, Object>();
        
        ClientTransport transport = LongPollingTransport.create(null);
        
        BayeuxClient client = new BayeuxClient("http://172.16.132.120:8080/CometDServerDemo/CometDServerDemo", transport);
        
        client.handshake();
        boolean handshaken = client.waitFor(1000, BayeuxClient.State.CONNECTED);
        
        if(handshaken)
        {
 
注意:访问的url地址中有两个CometDServerDemo,第一个是工程名,第二个是我们配置的servlet中路径
 
握手成功后,发布消息:
Map<String, Object> data = new HashMap<String, Object>();
            
            for(int i=0; i<1; ++i)
            {
                data.put("xxx", i);
                
                client.getChannel("/echo").publish(data);
                
                System.out.println("publish a message:" + client.getChannel("/echo").getId() + ":" + i);
                
                Thread.sleep(3000);
            }
 
握手成功后,订阅消息:
ClientSessionChannel.MessageListener echoListener = new EchoListener();
client.getChannel(CHANNEL).subscribe(echoListener);
private static class EchoListener implements ClientSessionChannel.MessageListener
    {
        @Override
        public void onMessage(ClientSessionChannel arg0, Message arg1) {
            System.out.println("Receive message:" + arg1);
         }    
    }
 
说明:客户端的代码非常简单,握手、心跳以及底层的通信部分,客户端jar都已经封装好了。我们只需要调用对应的函数发布或者是订阅消息即可。
 
3、客户端源码分析


 
类图分析:客户端源码主要是通过BayeuxClient类操作;该类的一个实例,代表在一个和server连接的客户端;通过该类的handshake启动连接,当成功连接上server后,获取到某个channel的BayeuxClientChannel实例,就可以订阅或者是发布某个channle的数据。BayeuxClient内部有一个简易的状态机实现,主要用于维护和server之间的状态。
 

 
 
基本流程:握手成功后,发送connect请求;当有对应的订阅数据返回时,connect响应立即返回,并把其中的推送消息通知上层应用;如果没有订阅数据,则connect响应在超时后返回,仅返回connect对应的响应。当接收到connect响应后,开始发送下一次connect连接
 
Long-Polling实现:long-Polling的底层实现非常简单,采用HTTPClient实现,就是普通的HTTP消息收发。
 
WebSocket实现:底层使用了jetty的websocket实现,细节不讨论
 
4、cometd的客户端实现简述
cometd客户端的实现比较简单,就是握手消息、心跳消息[并不是严格意义上的心跳,不过是类似的功能]以及推送消息的处理。功能主要有支持同一个客户端的多channel订阅;异常时的重连、重试处理机制(不仅仅是连接,包括整个握手过程)。
 
设计上首先用了把逻辑和协议层分离,逻辑上处理都是发送握手消息,发送心跳消息,订阅频道,处理返回的响应消息。其采用了状态机来管理整个过程。关键点是在处于connected状态时,可以同时处理心跳和推送来的消息。对于long-polling模式来说,如果有推送消息,则在响应中会同时返回心跳响应和推送消息,而不是仅仅返回推送消息,所以代码可以统一在接受到心跳响应时做断开重连的处理。对于ws模式,则server端可以随时推送消息过来,客户端也是在只有收到心跳响应时,才会发送下一个心跳消息。
 
上层处理的统一,带来的是数据的冗余。无论是否有消息,服务端都会返回一个心跳响应;虽然整个心跳消息并不是必须的;而且ws模式下,也没有直接使用ws协议定义的ping、pong消息,而是直接借用了long-polling模式下的心跳消息。
  • 大小: 125.2 KB
  • 大小: 40.8 KB
分享到:
评论
2 楼 Rainyn 2017-05-26  
作者写的很好。有完整项目实例吗?这个是跑在tomcat还是jetty上呢?
1 楼 hwfrog 2013-08-15  
不错, 学习了; 这段时间也想研究一下源码, 多交流

相关推荐

    Cometd 开发指南

    CometD是一种利用了Comet技术的框架,它能够在客户端和服务端之间建立持久的连接,并实现实时双向通信。Comet技术主要是为了解决HTTP协议的短连接问题,允许服务器主动向客户端发送数据,而不是传统Web应用中客户端...

    cometd-1.0.0rc0 源码

    CometD是一个开源的、基于Bayeux协议的JavaScript库,用于实现服务器推送技术(Server-Sent Events)。它使得Web应用程序能够实现实时通信,即服务器可以主动向客户端推送数据,而无需客户端频繁地发送请求。这个...

    cometd-jquery的jar

    CometD是一个基于Bayeux协议的开源 comet(也称为长轮询)框架,它提供了一个高效的、可扩展的、跨平台的实时通信解决方案。在Web开发中,实时通信是实现如聊天、股票更新、协作编辑等应用的关键技术。CometD支持...

    CometD 简介

    ### CometD 简介 #### 一、CometD 概述 CometD 是一个基于 Bayeux 协议实现的实时通信框架,它允许客户端与服务器之间进行双向数据传输,支持多种消息传递机制,包括轮询、长轮询、流式传输等。CometD 的设计目标...

    CometD2.x官方帮助手册

    CometD是一个开源的、基于Java的WebSocket和Bayeux协议的实时Web应用程序框架,它使得服务器能够与浏览器或其他客户端进行双向通信,实现高效的推送服务。这个“CometD2.x官方帮助手册”是该技术的离线版文档,包含...

    mycometd_push_Cometd_消息推送_

    CometD是一个开源的、基于Bayeux协议的双向通信框架,它允许Web服务器向客户端实时推送数据,而无需客户端不断发起请求。这种技术在现代Web应用中非常常见,尤其适用于实时聊天、股票更新、在线游戏等场景。下面将...

    cometd 框架实现的几个小程序

    CometD是一个基于Bayeux协议的开源框架,专门用于实现服务器到客户端的实时双向通信。这个框架在Web应用中非常有用,特别是对于需要实时更新数据的场景,比如聊天、股票报价、在线游戏等。CometD的核心理念是提供一...

    Jetty cometd(Continuation)学习笔记

    【Jetty彗星技术(Cometd)及Continuation机制详解】 Jetty是一个高效、轻量级的Java Servlet容器,不仅可作为HTTP服务器,还能作为HTTP客户端。它以其小巧、稳定和高性能的特点受到广泛赞誉,适合企业级应用的需求。...

    Cometd可运行实例

    这是一份Cometd的实例源码文件,导入到eclipse中用Tomcat发布服务即可。由于最近开发需要,本人根据cometd-3.0.5的开发文档,整理代码得出这份源码例子,http://localhost:8080/ComtedTest/ 输入昵称并点击加入即可...

    cometd-5.0.x.zip

    CometD是一个开源的、基于WebSocket的实时通信框架,它实现了Bayeux协议,使得Web应用可以实现双向通信,即服务器可以主动向客户端推送数据,而不仅仅是响应客户端的请求。在"cometd-5.0.x.zip"这个压缩包中,包含了...

    cometd实例demo

    CometD是一个基于Bayeux协议的开源JavaScript库,它实现了服务器推送技术,允许服务器主动向客户端发送数据,而不仅仅是响应客户端的请求。这个“cometd实例demo”提供了使用CometD的一个实际示例,可以帮助开发者...

    cometd-2.9.0-distribution.tar.gz

    CometD是一个开源的、基于Java的实时Web通信框架,它实现了Bayeux协议,允许服务器与客户端之间进行双向通信,实现高效的推送服务。在Web应用中,CometD广泛用于构建实时聊天、股票更新、在线游戏等需要即时数据交换...

    cometd-bayeux.jar

    cometd bayeux jar 类库

    cometd-3.0.0.beta2-distribution.tar.gz

    CometD是一个开源的、基于Java的WebSocket和Bayeux协议的实时Web应用程序框架。它提供了服务器推送技术,使得服务器可以主动向客户端发送数据,而不仅仅是响应客户端的请求。CometD的核心理念是通过长连接来实现双向...

    cometd注解实现java端代码实例

    本例是通过注解的形式写的cometd服务器端代码。通过spring的自动注入的功能,把cometd的服务可以注入到web controller中,controller可以调用cometd的服务方法向客户端发送任何需要的信息。网上很多例子都是客户端...

    一种基于Terracotta的透明分布式CometD引擎实现.pdf

    【标题】: "一种基于Terracotta的透明分布式CometD引擎实现.pdf" 【描述】: 提到的资源是关于如何利用Terracotta技术改进CometD引擎的分布式实现,旨在减少开发工作量并提高服务器的可扩展性。 【标签】: "分布式...

    cometd-java-oort-3.0.0.zip

    【标题】"CometD Java Oort 3.0.0" 是一个专注于实时通信的开源项目,而GWT(Google Web Toolkit)数据类型库则是为GWT项目提供通用数据类型和基础设施支持的一个简单库。 在Java编程领域,CometD是一个基于Bayeux...

    cometd-2.9.1-distribution.tar.gz_Cometd_微信推送 java_推送

    CometD是一个开源的、基于Bayeux协议的实时通信框架,主要应用于构建WebSocket和Ajax的长连接,实现服务器向客户端的实时数据推送。在Java领域,CometD被广泛用于构建类似QQ聊天和微信这样的实时通讯应用。下面将...

    cometd-archetype-spring-dojo-jetty7-2.8.0-RC1.zip

    【标题】"cometd-archetype-spring-dojo-jetty7-2.8.0-RC1.zip" 提供的是一个开源项目构建模版,主要用于创建基于CometD、Spring、Dojo以及Jetty 7的应用。这个压缩包的核心是帮助开发者快速搭建一个实时Web应用,...

Global site tag (gtag.js) - Google Analytics