comet4j解析

为什么会有这篇文章呢??

由于最近需要用到服务器推送技术,了解了一下这方面的知识,查找了好多例子,综合考虑使用Comet4j,不过目前这款插件只支持tomcat(按照tomcat的版本需要下载对应的jar包)。

准备工作

1.下载自己对应的版本的jar   tomcat6  -----comet4j-tomcat6.jar     tomcat7------comet4j-tomcat7.jar

2.下载comet4j.js

3、由于comet4j基于NIO实现,所以需要修改tomcat的server.xml中的配置见下图

将原先的HTTP/1.1改为org.apache.coyote.http11.Http11NioProtocol以支持NIO,这样第一步的准备工作就完成了。

下面 我们准备客户端代码

<html>

  <head>
    
    <title>论坛</title>
    
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->                                            
    <script type="text/javascript" src="${ctx }/yogurtResource/assembly/comet/comet4j.js"></script>
    <script type="text/javascript">
    
        $(document).ready(function(){
            init();
        });
            function init(){  
                var forum_list = $("#forum_list");  
                 JS.Engine.start('../comet');  
            JS.Engine.on(
                    'hello',function(text){
                             forum_list.html(text);
                             var html = "<span id='forum_list8'></span>"
                             $("#list").html(html);
                             $("#forum_list8").html("我是测是者a");
                       });  
                       
             JS.Engine.on('start',function(cId, channelList, engine){  
                     $("#forum_list3").html(cId);
                     });
        }  
    
    function addForum(){
        $.ajax({
            url:'${ctx }/forum/add_forum',
            data:{'hello':'hello'},
            type:"post",
            dataType:"json",
            success:function(data){
            //    alert("异步成功");
            },error:function(){
                alert("错误!!");
            }
        
        });    
    }
    </script>
  </head>
  <body>
       这是论坛页面<br><br><br><br><br><br>
       <div>
               <form  id="addForum" action="">
                   <input type="text" name="channel" value="hello"/></form>
            <button id="forum" οnclick="addForum();">模拟论坛提交</button>
       </div>
       <div id="list">
               <span id="forum_list"></span><br>
               <span id="forum_list2"></span>
               <span id="forum_list3"></span>
       </div>
       
  </body>
</html>

下面我们准备服务端代码

@Controller("forumController")
@RequestMapping("/forum")
public class ForumController extends BaseController{

    @RequestMapping(value = "/forum_list")
    public ModelAndView forumList(){
        
        return new ModelAndView("forum/forum_list");
    }
    
    @RequestMapping(value="/add_forum")
    @ResponseBody
    public Object addForum(){
        String abc="我是向前台推送的消息";
        User user=new User();
        user.setUsername("伟大的天朝");
        // 创建CometEngine实体类
        CometEngine engine = CometContext.getInstance().getEngine();
        engine.sendToAll("hello", user.getUsername());
        return user;
    }

 }

还需要一个监听来创建信道

public class ChannelComet implements ServletContextListener{
     private static final String CHANNEL = "hello";  
     public void contextInitialized(ServletContextEvent arg0) {  
            // CometContext是一个单例静态
             System.out.println("-----------------------------------------------------------------------------------------");
            CometContext cc = CometContext.getInstance();  
            cc.registChannel(CHANNEL);// 注册应用的channel  
            System.out.println("注册信道成功");
     }
        public void contextDestroyed(ServletContextEvent arg0) {  
      
        }  
      
    
}

最后来完成我们的配置工作

     <!-- comet4j -->  
        <listener>  
            <description>Comet4J容器侦听</description>  
            <listener-class>org.comet4j.core.CometAppListener</listener-class>  
        </listener>  
        <servlet>  
            <description>Comet连接[默认:org.comet4j.core.CometServlet]</description>  
            <display-name>CometServlet</display-name>  
            <servlet-name>CometServlet</servlet-name>  
            <servlet-class>org.comet4j.core.CometServlet</servlet-class>  
        </servlet>  
        <servlet-mapping>  
            <servlet-name>CometServlet</servlet-name>  
            <url-pattern>/comet</url-pattern>  
        </servlet-mapping>  
      
        <listener>  
            <description>ChannelComet</description>  
            <listener-class>ChannelComet</listener-class>  
        </listener>  
        <welcome-file-list>
            <welcome-file>index.jsp</welcome-file>
          </welcome-file-list>

注意:

         1、此处不再赘述API中的各个类的具体作用及功能,请自己网络查找(天朝的网络上我是找不到API,就不附赠 了)其他的jar包,js已上传comet4j请下载

               2、这里面的配置是有顺序要求的,真正的项目中肯定不只是这么几个配置项,配置顺序不对会导致无法响应后台推送到前台的消息

               3、监听要换成咱么自己的监听类

               4、CometServlet的url-pattern配置和前台的start项中的要一致

        

更多编程内容,请扫码关注《coder练习生》,如果觉得有用,也可赠送作者一杯咖啡

 

  • 1
    点赞
  • 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
发出的红包

打赏作者

ybb_ymm

你的鼓励会是对我最大的支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值