`
longgangbai
  • 浏览: 7307643 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论
阅读更多

      服务器推送技术的基础思想是将浏览器主动查询信息改为服务器主动发送信息,服务器发送一批数据,浏览器显示消息,同时保证与服务器的连接,当服务器需要再一次的发送数据,浏览器显示数据并保持连接。

comet基于HTTP长连接技术,无需安装插件。

 

 

 

  • comet:一个概念,web push
  • pushlet:comet的一个实现。
  • 就是保持长连接的策略问题,有人用jquery写了相应的util

 

  • Pushlet基于HTTP流,这种技术常常用在多媒体视频、通讯应用中,比如QuickTime。与装载HTTP页面之后马上关闭HTTP连接的做法相反,Pushlet采用HTTP流方式将新变动的数据主动地推送到client(客户端),再此期间HTTP连接一直保持打开。有关如何在Java中实现这种Keep-alive的长连接请参看Sun提供的《HTTP Persistent Connection》和W3C的《HTTP1.1规范》

 

  • Tomcat的comet原理其实同样很简单,它无非就是做了一件事情,它允许servlet执行完毕后的response没有被回收,我们只要拿到这个Reponse的引用并保存起来,就可以随时从Server向Client端Push数据了。每个连接一个线程的模型便非常简单。该模型对于 Comet 不大适用,但是,Java 对此同样有解决的办法。为了有效地处理 Comet,需要非阻塞 IO,Java 通过它的 NIO 库提供非阻塞 IO。两种最流行的开源服务器 Apache Tomcat 和 Jetty 都利用 NIO 增加非阻塞 IO,从而支持 Comet.

 

  • 而非阻塞I/O和同步I/O最明显的不同就是同步I/O所有可能被阻塞的地址在非阻塞I/O中都不会被阻塞。如在读取数据时,如果数据暂时无法被读取。那么在非阻塞I/O中会立刻返回,以便程序可以执行其他的代码,然后系统会不断侦测这个未完成的读取操作,直到可以继续读数据时再来完成这个操作。非阻塞式IO的出现的目的就是为了解决这个瓶颈。而非阻塞式IO是怎么实现的呢?非阻塞IO处理连接的线程数和连接数没有联系,也就是说处理10000个连接非阻塞IO不需要10000个线程,你可以用1000个也可以用2000个线程来处理。因为非阻塞IO处理连接是异步的。当某个连接发送请求到服务器,服务器把这个连接请求当作一个请求"事件",并把这个"事件"分配给相应的函数处理。我们可以把这个处理函数放到线程中去执行,执行完就把线程归还。这样一个线程就可以异步的处理多个事件。而阻塞式IO的线程的大部分时间都浪费在等待请求上了。
  • 在comet中,为了保持长连接,如果使用阻塞时IO,则不可避免的对每一个连接保持一个线程。不同于短连接,线程可以及时释放。长连接对应的线程可能永远不能释放,这样一个server能够服务的客户端的数量就受到了线程数量上限的限制。而使用NIO可以伺候多个连接而不必要保持相应数量的线程。就解决了这个问题。

 

  • Tomcat提供了CometProcessor接口,有这种特定标记的Servlet,Tomcat会做特殊处理,Tomcat不会把它当做普通Servlet实行完毕后,会回收request和response。注意:实现CometProcessor接口后不用在servlet中写doGet,doPoset方法,所有事件在BEGIN,READ,END,ERROR中实现。
  • 从event拿到的request和response不会在begin和end/error之间不会被释放,一直有效。可以用来传递消息。Note that the response object and dependent OutputStream and Writer are still not synchronized, so when they are accessed by multiple threads, synchronization is mandatory.
  • BEGIN:初始化参数和获取request和response,结束时,request is commited
  • READ(只有POST方法,才会触发该事件):有数据从request进来,可以从request读取数据。在此事件之外不允许读取request的数据。On some platforms, like Windows, a client disconnect is indicated by a READ event. Reading from the stream may result in -1, an IOException or an EOFException. Make sure you properly handle all these three cases. If you don't catch the IOException, Tomcat will instantly invoke your event chain with an ERROR as it catches the error for you, and you will be notified of the error at that time.
  • END: End may be called to end the processing of the request. Fields that have been initialized in the begin method should be reset. After this event has been processed, the request and response objects, as well as all their dependent objects will be recycled and used to process other requests. End will also be called when data is available and the end of file is reached on the request input (this usually indicates the client has pipelined a request).
  • ERROR: Error will be called by the container in the case where an IO exception or a similar unrecoverable error occurs on the connection. Fields that have been initialized in the begin method should be reset. After this event has been processed, the request and response objects, as well as all their dependent objects will be recycled and used to process other requests.(END,ERROR之后request和response就不要再用了)

 

  • ventSubType.TIMEOUT: The connection timed out (sub type of ERROR); note that this ERROR type is not fatal, and the connection will not be closed unless the servlet uses the close method of the event.
  • EventSubType.CLIENT_DISCONNECT: The client connection was closed (sub type of ERROR). method of the event.
  • EventSubType.IOEXCEPTION: An IO exception occurred, such as invalid content, for example, an invalid chunk block (sub type of ERROR).
  • EventSubType.WEBAPP_RELOAD: The web application is being reloaded (sub type of END).
  • EventSubType.SESSION_END: The servlet ended the session (sub type of END).

BEGIN-READ-READ-Error/TIMEOUT。随时可以event.close()。来终止连接。

 

 

  • writer.flush();writer.close();长轮询和流风格的comet的差别只是取决于是否有第二句(长轮询需要client端在response关闭后再重连)

 

If you are using the NIO connector, you can set individual timeouts for your different comet connections. To set a timeout, simply set a request attribute like the following code shows:

CometEvent event.... event.setTimeout(30*1000);

or

event.getHttpServletRequest().setAttribute("org.apache.tomcat.comet.timeout", new Integer(30 * 1000));

This sets the timeout to 30 seconds. Important note, in order to set this timeout, it has to be done on the BEGIN event. The default value is soTimeout

 

 

      简单的Comet servlet代码示例:

package com.easyway.comet.pushlet;

import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import org.apache.catalina.CometEvent;
import org.apache.catalina.CometProcessor;
import org.apache.catalina.CometEvent.EventType;
/**
 * Tomcat6推送技术通过时现实tomcat的推送接口CometProcessor实现的servlet实现推送技术,在
 * servlet中out.close()方法不能使用,否則不能持續推送信息.
 * <p>功能描述,该部分必须以中文句号结尾。<p>
 *
 * 创建日期  2013-7-21<br>
 * @author  longgangbai <br>
 * @version $Revision$ $Date$
 * @since   3.0.0
 */
public class CometServlet extends HttpServlet implements CometProcessor {
    //
    private static final long serialVersionUID = 1L;

    public void event(CometEvent e) throws IOException, ServletException {
        if (e.getEventType() == EventType.BEGIN) {
            // fill in code handling here
           HttpServletResponse response = e.getHttpServletResponse();
            PrintWriter out = response.getWriter();
            out.write("Hello world");
            out.flush(); 
            //System.out.println("message sent");
        }else if (e.getEventType() == EventType.READ) {
        }else if (e.getEventType() == EventType.ERROR) {
        }else if(e.getEventType() == EventType.END){
        }
      
        // and continue handing other events
    }
}

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>CometTomcat6</display-name>
  <servlet>
     <servlet-name>cometTomcet6</servlet-name>
     <servlet-class>com.easyway.comet.pushlet.CometServlet</servlet-class>
  </servlet>
  <servlet-mapping>
      <servlet-name>cometTomcet6</servlet-name>
      <url-pattern>/cometServlet</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>

 

html界面代碼:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
 <script>
 //服务器端代码类似与普通Ajax代码,其中,需要注意的是:request.readyState值如果设置为4,浏览器会处于长期等待状态,而收不到响应消息,设置为3后,firefox浏览器正常,但IE不能正常获得消息
 function CometEx() {
   var request =  new XMLHttpRequest();
   request.open("GET", "http://localhost:8080/CometTomcat6/cometServlet", true);
   request.onreadystatechange = function() {
     if (request.readyState == 3 && request.status == 200) {
            alert(request.responseText);     
     }
   }
   request.send(null);
 }
 </script>
<body onload="CometEx();">

</body>
</html>

 

分享到:
评论

相关推荐

    tomcat实现推送技术

    【标题】:“Tomcat实现推送技术” 在Web开发中,传统的HTTP协议是基于请求-响应模型的,服务器只会在客户端发起请求时返回数据。然而,实时性需求的提升催生了服务器推送技术,使得服务器能够主动将数据推送给...

    Tomcat comet 服务器推技术

    Tomcat 的 Comet 技术是一种基于 HTTP 长连接的服务器推送技术,允许服务器在客户端保持一个开放的 HTTP 连接,从而能够在数据准备好时立即推送到客户端,而无需客户端发起新的请求。这种技术在实时性要求高的场景,...

    androidpn消息推送-tomcat版

    ### AndroidPN消息推送-Tomcat版详解 #### 一、概述 **AndroidPN消息推送-Tomcat版**是一种用于Android设备的消息推送系统,它利用XMPP协议实现了客户端与服务器之间的实时通讯。本系统分为客户端和服务端两大部分...

    android消息推送服务Tomcat版本

    在这个场景中,"Tomcat版本"指的是使用Tomcat作为服务器环境来部署消息推送服务。Tomcat是一款开源、轻量级的Java应用服务器,广泛应用于Web应用程序的部署,包括Android消息推送服务。 Android消息推送...

    phonegap+websocket+tomcat实现推送功能

    总的来说,"phonegap+websocket+tomcat实现移动终端推送功能"项目涉及到的技术栈包括前端的PhoneGap应用开发、WebSocket的JavaScript客户端实现、后端的Tomcat服务器配置以及WebSocket的Java服务端编程。通过这一...

    comet4j-tomcat7后台信息推送jar包

    在这个场景中,"comet4j-tomcat7后台信息推送jar包"是一个专门为Tomcat7服务器设计的实现Comet技术的组件。 Tomcat7是Apache软件基金会的Apache Tomcat服务器的一个版本,它是一个开源的、实现了Java Servlet和Java...

    comet4j-tomcat6-tomcat7-jar包以及js文件

    Comet4j是一种基于Java的实时通信框架,它主要用于实现服务器向客户端的长连接推送技术。这个压缩包包含了与Comet4j相关的几个关键组件,适用于Tomcat 6和7两个版本的服务器环境。让我们详细了解一下这些内容。 ...

    comet4j+tomcat6+tomcat7并附完整版Demo

    4. **部署说明**:如何将这些代码部署到Tomcat 6或7上,以及如何启动和测试推送功能。 在实际应用中,使用Comet4j+Tomcat组合的优点在于: - **实时性**:Comet技术解决了传统HTTP短链接模式下服务器无法主动推送...

    机关推送服务器端实现

    【机关推送服务器端实现】是...综上所述,"机关推送服务器端实现"是一项结合了极光推送服务、Java编程和Tomcat服务器部署的技术实践。通过合理的开发和优化,可以构建出高效、可靠的推送系统,满足企业内部沟通的需求。

    comet demo 向客户端推送例子

    Comet技术是一种基于HTTP长连接的反向Ajax技术,它允许服务器向客户端浏览器主动推送数据,从而实现双向通信。在Web应用中,通常的HTTP请求是客户端发起的,而Comet打破了这种模式,使得服务器可以在适当的时候主动...

    服务器推送技术之comet4j资源包

    服务器推送技术是现代Web开发中一个重要的概念,它允许服务器主动向客户端发送数据,而不仅仅是响应客户端的请求。Comet4j就是一种基于Java实现的服务器推送技术框架,旨在简化实时Web应用的开发过程。本资源包包含...

    一个基于pushlet推送的小例子

    【推送技术】 推送技术是Web开发中的一种高级机制,它允许服务器主动向客户端发送数据,而无需客户端频繁地发起请求。这种技术在实时性要求较高的应用中非常常见,如实时聊天、股票报价、在线游戏等。传统的HTTP协议...

    web推送 comet技术

    在"web推送 Comet技术"的项目中,我们使用了Tomcat7作为服务器环境。Tomcat是一个流行的开源Java Servlet容器,支持Java EE的Web应用程序。配置Tomcat7以支持Comet技术,通常需要修改服务器的配置文件,如`server....

    javaweb实现后台向前台的消息推送 comet4j

    本示例介绍的是如何使用Comet4j这个第三方库来实现后台到前台的消息推送功能。Comet4j是一个专门用于JavaWeb应用的长连接通讯框架,它简化了基于Comet技术的实时通信实现。 首先,我们要理解Comet技术。Comet是一种...

    comet4j-tomcat6.jar、comet4j-tomcat7.jar、comet4j.js

    Comet4J是一种基于Java实现的长连接技术,...综上所述,这个压缩包提供了在Tomcat6和Tomcat7环境下使用Comet4J进行实时数据推送的必要组件。通过合理配置和使用这些资源,开发者可以构建出高效、实时的Web应用程序。

    comet4j所需js与jar包(tomcat6与tomcat7)

    Comet4J是一个针对Java平台的服务器推送框架,专门用于实现AJAX(XMLHttpRequest)技术的长轮询和 comet 模式。这个框架的核心目的是在Web应用中实现实时通信,使得服务器能够主动向客户端推送数据,而无需客户端...

    Android平台消息推送技术的应用研究.pdf

    【Android平台消息推送技术的应用研究】 在移动互联网时代,Android平台的消息推送技术已经成为开发者不可或缺的工具,用于增强用户体验,提高应用的活跃度。本文主要探讨了Android平台上消息推送的实现方式,特别...

    通过推送机制(Tomcat comet,pushlet)实现进度条

    标题中的“通过推送机制(Tomcat comet,pushlet)实现进度条”涉及到的是Web应用中的一种实时通信技术,主要用于提供动态更新和用户交互。这里主要介绍Tomcat的Comet和Pushlet技术,以及如何利用它们来创建一个...

    comet4j 自己写的消息推送 觉得实用

    在 Web 应用中,消息推送技术是必不可少的,它可以实现如即时聊天、股票更新、在线游戏等实时交互功能。Comet 技术是早期为解决这一问题提出的一种解决方案,它通过保持 HTTP 连接长时间打开(HTTP Long-Polling、...

    消息推送项目源码

    4. **Socket长连接技术**:消息推送的关键技术是Socket长连接,它允许服务器与客户端之间保持持续的通信通道,以便在需要时即时发送消息。这种方式优于传统的HTTP短链接,因为减少了建立和关闭连接的开销,提高了推...

Global site tag (gtag.js) - Google Analytics