使用Comet4j实现消息推送

cometjava 

Comet4J(Comet for Java)是一个纯粹基于AJAX(XMLHTTPRequest)的服务器推送框架,消息以JSON方式传递,具备长轮询、长连接、自动选择三种工作模式。有关comet4j更多的信息在此不再详细展开,需要了解的请访问地址 http://code.google.com/p/comet4j/。 

在项目中使用comet4j需要引入2个文件,comet4j.js、comet4j-tomcat6.jar。下面是一个示例,希望对需要的人有所帮助。不足之处还请大神谅解。 

view:hello.jsp 
Jsp代码 

 收藏代码

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  2.     pageEncoding="UTF-8"%>  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  4. <html>  
  5. <head>  
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  7. <title>comet</title>  
  8. <script type="text/javascript" src="/comet4j_demo/js/jquery-1.8.0.min.js"></script>  
  9. <script type="text/javascript" src="/comet4j_demo/js/comet4j.js"></script>  
  10.   
  11. <script type="text/javascript">  
  12.    
  13. $(function(){  
  14.     JS.Engine.on('hello', function(text){   
  15.         $("#targetDiv").append("<span id='msgSpan' style='color:red'>" + text + "</span>");  
  16.     });  
  17.       
  18.     <%  
  19.         String userId = request.getParameter("userId");  
  20.         session.setAttribute("currentUserId", userId);  
  21.     %>  
  22.   
  23.     JS.Engine.start('conn');  
  24. });  
  25.   
  26. $(document).ready(function(){  
  27.     $("#targetDiv").bind("click", function(){  
  28.         //有新消息  
  29.         if ($(this).find("span").length > 0) {  
  30.             $("div > span").remove();  
  31.         }  
  32.     });  
  33. });   
  34.   
  35. </script>  
  36. </head>  
  37. <body>  
  38.     <table border="1" width:600px>  
  39.         <tr>  
  40.             <td>hello comet</td>  
  41.             <td><div id="targetDiv" style="width:300px"></div></td>  
  42.         </tr>  
  43.     </table>  
  44. </body>  
  45. </html>  



service code:NewMsgCollector.java 

Java代码 

  1. public class NewMsgCollector extends ConnectListener implements ServletContextListener {  
  2.   
  3.     private static final String CHANNEL = "hello";  
  4.   
  5.     @Override  
  6.     public void contextInitialized(ServletContextEvent contextEvent) {  
  7.         //注册应用的channel  
  8.         CometContext context = CometContext.getInstance();  
  9.         context.registChannel(CHANNEL);  
  10.           
  11.         //添加监听器  
  12.         CometEngine engine = CometContext.getInstance().getEngine();  
  13.         engine.addConnectListener(this);  
  14.     }  
  15.       
  16.     @Override  
  17.     public void contextDestroyed(ServletContextEvent contextEvent) {}  
  18.   
  19.     @Override  
  20.     public boolean handleEvent(ConnectEvent connEvent) {  
  21.         final CometConnection conn = connEvent.getConn();  
  22.           
  23.         //建立连接和用户的关系  
  24.         doCache(conn);  
  25.   
  26.         final String connId = conn.getId();  
  27.   
  28.         /*模拟业务逻辑*/  
  29.         Timer timer = new Timer(true);  
  30.         TimerTask task = new TimerTask() {  
  31.             @Override  
  32.             public void run() {  
  33.                 CometEngine engine = CometContext.getInstance().getEngine();  
  34.                 //推送到所有客户端  
  35.                 //engine.sendToAll("hello", connId + " - you have " + ((int)(Math.random() * 9) + 1) + " new message <br />");  
  36.   
  37.                 if (CacheManager.getContent(connId).isExpired()) {  
  38.                     doCache(conn);  
  39.                 }  
  40.   
  41.                 if (simulateService(String.valueOf(CacheManager.getContent(connId).getValue()))) {  
  42.                     //推送到指定的客户端  
  43.                     engine.sendTo(CHANNEL, engine.getConnection(connId), CacheManager.getContent(connId).getValue()  
  44.                             + " - you have " + ((int) (Math.random() * 9) + 1) + " new message <br />");  
  45.                 }  
  46.             }  
  47.         };  
  48.         timer.schedule(task, 10000, (1000 * 5));  
  49.         return true;  
  50.     }  
  51.   
  52.     private void doCache(final CometConnection conn) {  
  53.         Object userId = conn.getRequest().getSession().getAttribute("currentUserId");  
  54.         if (userId != null) {  
  55.             CacheManager.putContent(conn.getId(), String.valueOf(userId), CacheConstant.EXPIRE_AFTER_ONE_HOUR);  
  56.         }  
  57.     }  
  58.   
  59.     /** 
  60.      * 模拟业务 
  61.      * 返回true,false 
  62.      * true即表示需要推送消息,false即不需要推送 
  63.      */  
  64.     private boolean simulateService(String id) {  
  65.         int flag = (int) Math.round(Math.random());  
  66.         if (flag == 0) {  
  67.             System.out.println(id + " - no messge...");  
  68.             return false;  
  69.         }  
  70.         System.out.println(id + " - messge is coming...");  
  71.         return true;  
  72.     }  
  73. }  



web.xml 

Xml代码 

  1.       
  2. <listener>  
  3. <description>Comet4J容器侦听</description>  
  4. <listener-class>org.comet4j.core.CometAppListener</listener-class>  
  5. </listener>  
  6.   
  7. <servlet>  
  8. <description>Comet连接[默认:org.comet4j.core.CometServlet]</description>  
  9. <display-name>CometServlet</display-name>  
  10. <servlet-name>CometServlet</servlet-name>  
  11. <servlet-class>org.comet4j.core.CometServlet</servlet-class>  
  12. </servlet>  
  13.   
  14. <servlet-mapping>  
  15. <servlet-name>CometServlet</servlet-name>  
  16. <url-pattern>/conn</url-pattern>  
  17. </servlet-mapping>  
  18.   
  19. <listener>  
  20. <description>NewMsgCollector</description>  
  21. <listener-class>NewMsgCollector</listener-class>  
  22. </listener>  

转载于:https://my.oschina.net/lvzunwei/blog/1823848

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Comet4J(Comet for Java)是一个纯粹基于AJAX(XMLHTTPRequest)的服务器框架,消息以JSON方式传递,具备长轮询、长连接、自动选择三种工作模式。 功能特性 消息广播。 定向消息。 提供连接上线前、上线、下线前、下线、发消息等多种可处理事件。 消息缓存机制,确保长轮询工作模式下不丢失消息。 客户端正常下线,服务端可立即感知。 客户端异常停止工作,服务端可定时检查并感知。 以注册通道应用的方式,让开发者对框架功能进行扩展,实现自己的应用。 框架特性 独立小巧,不依赖于第三方包。 与应用紧密集成,无需独立应用或服务器。 与Session无关的连接机制,为开发人员提供最大程度的功能可控性。 面向事件编程,客户端与服务器端均为事件驱动开发模式,提供了良好的可扩展性机制。 各项性能参数均可配置。 支持多种主流浏览器,并支持Air应用环境。 服务器支持情况 Tomcat6、Tomcat7 浏览器支持情况 支持XMLHTTPRequest对象的浏览器均可支持长轮询工作模式,但不一定能够支持长连接。 | 浏览器/平台 | 版本 | 长轮询 | 长连接 | |:-----------|:-------|:--------|:--------| | Internet Explorer | 6,7,8,9 | √ | X | | FireFox | 3.0+(更底版本未知) | √ | √ | | Chrome | 7.0+(更底版本未知) | √ | √ | | Safari | 5+(更底版本未知) | √ | √ | | Opera | 11.10+(更底版本未知) | √ | X | | Air | 1.5+(更底版本未知) | √ | √ | | IOS(Iphone/Ipad)| 3.1+(更底版本未知) | √ | √ | | Android | 未测试 | 未知 | 未知 | | BlackBerry | 未测试 | 未知 | 未知 |

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值