`
cobra
  • 浏览: 49522 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

Tomcat 6支持的Comet

    博客分类:
  • Ajax
阅读更多

今天在测试中无意中看到Tomcat 6的新特性Comet,使用Comet技术可以轻松实现一个Pushlet的功能,让我看了着实兴奋不已,而其官方网站还给出了一个Messenger的例子。

  1. public class ChatServlet
  2. extends HttpServlet implements CometProcessor {
  3.  
  4. protected ArrayList<HttpServletResponse> connections =
  5. new ArrayList<HttpServletResponse>();
  6. protected MessageSender messageSender = null;
  7. public void init() throws ServletException {
  8. messageSender = new MessageSender();
  9. Thread messageSenderThread =
  10. new Thread(messageSender, "MessageSender[" + getServletContext().getContextPath() + "]");
  11. messageSenderThread.setDaemon(true);
  12. messageSenderThread.start();
  13. }
  14.  
  15. public void destroy() {
  16. connections.clear();
  17. messageSender.stop();
  18. messageSender = null;
  19. }
  20.  
  21. /**
  22. * Process the given Comet event.
  23. *
  24. * @param event The Comet event that will be processed
  25. * @throws IOException
  26. * @throws ServletException
  27. */
  28. public void event(CometEvent event)
  29. throws IOException, ServletException {
  30. HttpServletRequest request = event.getHttpServletRequest();
  31. HttpServletResponse response = event.getHttpServletResponse();
  32. if (event.getEventType() == CometEvent.EventType.BEGIN) {
  33. log("Begin for session: " + request.getSession(true).getId());
  34. PrintWriter writer = response.getWriter();
  35. writer.println("<!doctype html public \"-//w3c//dtd html 4.0 transitional//en\">");
  36. writer.println("<head><title>JSP Chat</title></head><body bgcolor=\"#FFFFFF\">");
  37. writer.flush();
  38. synchronized(connections) {
  39. connections.add(response);
  40. }
  41. } else if (event.getEventType() == CometEvent.EventType.ERROR) {
  42. log("Error for session: " + request.getSession(true).getId());
  43. synchronized(connections) {
  44. connections.remove(response);
  45. }
  46. event.close();
  47. } else if (event.getEventType() == CometEvent.EventType.END) {
  48. log("End for session: " + request.getSession(true).getId());
  49. synchronized(connections) {
  50. connections.remove(response);
  51. }
  52. PrintWriter writer = response.getWriter();
  53. writer.println("</body></html>");
  54. event.close();
  55. } else if (event.getEventType() == CometEvent.EventType.READ) {
  56. InputStream is = request.getInputStream();
  57. byte[] buf = new byte[512];
  58. do {
  59. int n = is.read(buf); //can throw an IOException
  60. if (n > 0) {
  61. log("Read " + n + " bytes: " + new String(buf, 0, n)
  62. + " for session: " + request.getSession(true).getId());
  63. } else if (n < 0) {
  64. error(event, request, response);
  65. return;
  66. }
  67. } while (is.available() > 0);
  68. }
  69. }
  70.  
  71. public class MessageSender implements Runnable {
  72.  
  73. protected boolean running = true;
  74. protected ArrayList<String> messages = new ArrayList<String>();
  75. public MessageSender() {
  76. }
  77. public void stop() {
  78. running = false;
  79. }
  80.  
  81. /**
  82. * Add message for sending.
  83. */
  84. public void send(String user, String message) {
  85. synchronized (messages) {
  86. messages.add("[" + user + "]: " + message);
  87. messages.notify();
  88. }
  89. }
  90.  
  91. public void run() {
  92.  
  93. while (running) {
  94.  
  95. if (messages.size() == 0) {
  96. try {
  97. synchronized (messages) {
  98. messages.wait();
  99. }
  100. } catch (InterruptedException e) {
  101. // Ignore
  102. }
  103. }
  104.  
  105. synchronized (connections) {
  106. String[] pendingMessages = null;
  107. synchronized (messages) {
  108. pendingMessages = messages.toArray(new String[0]);
  109. messages.clear();
  110. }
  111. // Send any pending message on all the open connections
  112. for (int i = 0; i < connections.size(); i++) {
  113. try {
  114. PrintWriter writer = connections.get(i).getWriter();
  115. for (int j = 0; j < pendingMessages.length; j++) {
  116. writer.println(pendingMessages[j] + "<br>");
  117. }
  118. writer.flush();
  119. } catch (IOException e) {
  120. log("IOExeption sending message", e);
  121. }
  122. }
  123. }
  124.  
  125. }
  126.  
  127. }
  128.  
  129. }
  130.  
  131. }

分享到:
评论
1 楼 xanodu 2009-01-07  
108connections是什么?

相关推荐

    配置tomcat支持comet

    NULL 博文链接:https://tomenjoy.iteye.com/blog/899715

    comet4j-tomcat7.jar和comen4j.js

    服务器主动向客户端推送消息所需的comet4j-tomcat7.jar和comen4j.js,在此需注意:comet4j-tomcat7.jar目前仅支持tomcat6和tomcat7

    comet4j-tomcat6.jar|comet4j-tomcat7.jar下载_以及对Jfinal类以及Zcurd项目的支持

    Comet4j为针对java web项目的后台消息推送工具,支持后台主动往浏览器推送消息。附件rar包提供Comet4j基础资源包下载,适用于所有Comet4j项目,同时特别针对comet4j对Jfinal类以及Zcurd项目的支持做了一些注意事项...

    comet4j包含tomcat6和tomcat7的jar包和js

    Comet4J是一个微型的即时推送框架,它分为服务端与客户端两部分,你只要将服务器端(JAR文件,目前仅支持Tomcat6、7)放入WEB-INF\lib,客户端(JavaScript文件)引入到页面,那么你的应用就具备了向客户端推送信息的...

    Comet4J服务器端推送技术

    Comet4J是一个微型的即时推送框架,它分为服务端与客户端两部分,你只要将服务器端(JAR文件,目前仅支持Tomcat6、7)放入WEB-INF\lib,客户端(JavaScript文件)引入到页面,那么你的应用就具备了向客户端推送信息的...

    comet4j.zip完整资源

    comet4j.zip完整资源 包含支持tomcat6 tomcat7的jar包

    Apache-Tomcat-8.5.5(Linux )

    &lt;6&gt; 不再支持Comet; &lt;7&gt; 对不合法的HTTP method名字直接拒绝并返回400; &lt;8&gt; AJP连接处理异步请求时,确保请求处理完成再继续处理下一个请求; &lt;9&gt; 提高对HTTP/2 stream reset的处理; &lt;10&gt; 支持64K的...

    apr库(tomcat优化)

    它又分为BIO Http Connector与NIO Http Connector两种,后者提供非阻塞IO与长连接Comet支持。  AJP Connector, 基于AJP协议,AJP是专门设计用来为tomcat与http服务器之间通信专门定制的协议,能提供较高的通信速度...

    comet4j一整套官方出品前后端jar包,js,Demo包

    Tomcat6、Tomcat7 浏览器支持情况 支持XMLHTTPRequest对象的浏览器均可支持长轮询工作模式,但不一定能够支持长连接。 | 浏览器/平台 | 版本 | 长轮询 | 长连接 | |:-----------|:-------|:--------|:--------| | ...

    tomcat9 tar.tz压缩包

    1、新增HTTP/2支持和TLS虚拟主机。 2、实现当前Servlet4.0规范草案 3、BIO connectors 不再支持Windows Itanium 和 Comet 4、Tomcat 9.0设计用于运行在Java se 8及以后的版本。

    comet4j开发指南

    Comet4J是一个微型的即时推送框架,它分为服务端与客户端两部分,你只要将服务器端(JAR文件,目前仅支持Tomcat6、7)放入WEB-INF\lib,客户端(JavaScript文件)引入到页面,那么你的应用就具备了向客户端推送信息的...

    apache-tomcat-7.0.27

    支持WebSocket协议(RFC6455)。提供了流和基于消息的API,另外还包括了一些示例。 修复了一些针对HTTP NIO连接器的bug,特别是当使用Comet时出现的bug。 改善了内存泄露预防机制和代码检测功能,以便可以在IBM的JVM...

    apr库(tomcat优化) for native 20

    它又分为BIO Http Connector与NIO Http Connector两种,后者提供非阻塞IO与长连接Comet支持。  AJP Connector, 基于AJP协议,AJP是专门设计用来为tomcat与http服务器之间通信专门定制的协议,能提供较高的通信速度...

    comet4j:自动从code.google.compcomet4j导出

    comet4jAutomatically exported from code.google.com/p/comet4j功能特性推送消息广播。推送定向消息。提供连接上线前、上线、下线前、下线、发送消息等多种可...服务器支持情况Tomcat6、Tomcat7浏览器支持情况支持XML

    Jetty中文手册

    配置Ajax、Comet和异步Servlets 持续和异步Servlets 100 Continue和102 Processing WebSocket Servlet 异步的REST Stress Testing CometD 使用Servlets和Filters Jetty中绑定的Servlets Quality of Service Filter ...

Global site tag (gtag.js) - Google Analytics