使用Comet4J主动向客户端推送消息

【准备工作】

1、下载comet4j.js  :http://files.cnblogs.com/xiaoMzjm/comet4j.js.rar

2、下载comet4j-tomcat6.jar  :http://files.cnblogs.com/xiaoMzjm/comet4j-tomcat6.jar.rar

3、到tomcat目录下——conf——server.xml 下,把

    <Connector port="8080" 
               connectionTimeout="20000"  protocol="org.apache.coyote.http11.Http11NioProtocol"
               redirectPort="8443" URIEncoding="UTF-8" address="0.0.0.0"/>
    <Connector port="443" protocol="org.apache.coyote.http11.Http11Protocol" SSLEnabled="true"
               maxThreads="150" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" keystoreFile="D:\data\test.keystore"  
       keystorePass="trkj111!!!" /> 

4、配置web.xml

 <listener>
        <listener-class>org.directwebremoting.servlet.DwrListener</listener-class>
    </listener>
    <listener>
        <listener-class>org.comet4j.core.CometAppListener</listener-class>
    </listener>
    <listener>
        <description>HelloWorld</description>
        <listener-class>com.dm.core.system.TestComet</listener-class>
    </listener>
    <servlet>
        <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>/storage/conn</url-pattern>
    </servlet-mapping>

web.xml配置到相应的模块下。

5、界面

<#include "/WEB-INF/view/macro.ftl"/>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Comet4J Hello World</title>
<script type="text/javascript" src="${path}/js/comet4j.js"></script>
<script type="text/javascript">
function init(){

        var number1 = document.getElementById('number1');
        var number2 = document.getElementById('number2');
        // 建立连接,conn 即web.xml中 CometServlet的<url-pattern>
        JS.Engine.start('conn');
        // 监听后台某个频道
        JS.Engine.on(
               {
                   // 对应服务端 “频道1” 的值 result1
                   result1 : function(num1){
                       number1.innerHTML = num1;
                },
                // 对应服务端 “频道2” 的值 result2
                result2 : function(num2){
                       number2.innerHTML = num2;
                }
            }
           );
}
</script>
</head>
<body οnlοad="init()">
        数字1:<span id="number1">...</span><br/>
        数字2:<span id="number2">...</span>
</body>
</html>

6、java后台端

package com.dm.core.system;


import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import com.dm.core.util.SeriPortUtil;
import com.dm.core.util.StringUtil;
import gnu.io.SerialPort;
import org.comet4j.core.CometContext;
import org.comet4j.core.CometEngine;

/**
 * 描述:服务端主动推送消息到客户端  简单例子
 * @author zjm
 * @time 2014/8/7
 */
public class TestComet implements ServletContextListener {

        // 频道1
        private static final String CHANNEL1 = "result1";
        // 频道2
        private static final String CHANNEL2 = "result2";

        // 通过频道1推送给前台的变量1
        private static int number1 = 0 ;
        // 通过频道2推送给前台的变量2
        private static int number2 = 100 ;
         SerialPort sp = SeriPortUtil.open("COM4");
        /**
         * 初始化上下文
         */
        public void contextInitialized(ServletContextEvent arg0) {

                // CometContext : Comet4J上下文,负责初始化配置、引擎对象、连接器对象、消息缓存等。
                CometContext cc = CometContext.getInstance();
                // 注册频道,即标识哪些字段可用当成频道,用来作为向前台传送数据的“通道”
                cc.registChannel(CHANNEL1);
                cc.registChannel(CHANNEL2);

                Thread myThread = new Thread(new SendToClientThread(), "SendToClientThread");
                // 下面的内部类的方法是个死循环,设置helloAppModule线程为“守护线程”,则当jvm只剩“守护线程”时(主线程结束),该线程也会结束。
                myThread.setDaemon(true);
                // 开始线程
                myThread.start();
        }

        /**
         * 内部类线程类
         */
        class SendToClientThread implements Runnable {
                public void run() {
                         try{
                        while (true) {
                                try {
                                        Thread.sleep(1000);
                                } catch (Exception ex) {
                                        ex.printStackTrace();
                                }
                                // CometEngine : 引擎,负责管理和维持连接,并能够必要的发送服务
                                CometEngine engine = CometContext.getInstance().getEngine();
                                // 参数的意思:通过什么频道(CHANNEL1)发送什么数据(number1++),前台可用可用频道的值(result1)来获取某频道发送的数据
                            String pk = SeriPortUtil.sendEpc_Num(sp).toString();
//                              engine.sendToAll(CHANNEL1, pk);
                              engine.sendToAll(CHANNEL1, "{1100EE00E28068100000003C33CF7047F19B=3,1100EE0000006747451201861960A3D924FC=9}");
                                engine.sendToAll(CHANNEL2, number2++);
                             Thread.sleep(3000);
                        }
                         }catch (Exception e){

                         }
                }
        }

        public void contextDestroyed(ServletContextEvent arg0) {
        }
}

欢迎关注我的公众号,会有不一样的惊喜。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值