comet4j使用教程

作者:じ☆ve宝贝

发布时间:2016-08-16T18:03:30

web.xml

	<!-- 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>/test</url-pattern>
	</servlet-mapping>
	<listener>
		<description>CometListener</description>
		<listener-class>cn.harvetech.listener.CometListener</listener-class>
	</listener>

Const.java

public static final String MSG_CHANEL = "studyjava";

CometListener

package cn.harvetech.listener; 

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.Logger;
import org.comet4j.core.CometConnection;
import org.comet4j.core.CometContext;
import org.comet4j.core.CometEngine;
import org.comet4j.core.event.ConnectEvent;
import org.comet4j.core.event.DropEvent;
import org.comet4j.core.listener.ConnectListener;
import org.comet4j.core.listener.DropListener;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import cn.studyjava.service.RedisService;
import cn.studyjava.util.Const;

/**
 * 
 * 作者: zsljava
 * 邮件: zsljava@163.com  
 * 时间: 2016年3月28日 下午5:11:56
 * 描述: 消息推送监听器
 * 注意: tomcat7的jar包  comet4j-tomcat7.jar  
 * 		tomcat6的jar包  comet4j-tomcat6.jar 
 *	tomcat下server.xml的配置
 *	    <Connector URIEncoding="UTF-8" connectionTimeout="20000" port="80" 
 *			protocol="org.apache.coyote.http11.Http11NioProtocol" redirectPort="8443"/>  
 * 	protocol 连接方式修改成为nio的的就行了 
 * 	注意listener生命周期不受spring管理 在listener中使用spring的beans需要用WebApplicationContextUtils
 */
public class CometListener implements ServletContextListener{
	private static Logger logger = Logger.getLogger(CometListener.class);
	
	private RedisService  redisService;
	
	public void contextInitialized(ServletContextEvent sce) {
		CometContext cc = CometContext.getInstance();
		cc.registChannel(Const.MSG_CHANEL);// 注册应用的channel
		CometEngine engine = cc.getEngine();  
		engine.addConnectListener(new JoinListener());  //上线通知
		engine.addDropListener(new LeftListener());  //离线通知
		WebApplicationContext context = WebApplicationContextUtils.getRequiredWebApplicationContext(cc.getServletContext());
		redisService = (RedisService) context.getBean("redisService"); //获取redis
		logger.info("初始化comet4j消息推送框架");
	}
	
	class JoinListener extends ConnectListener {
		public boolean handleEvent(ConnectEvent anEvent) {
			CometConnection conn = anEvent.getConn();
			redisService.set(conn.getRequest().getSession().getId(), conn.getId());//客户端连接后存储ChanelId
			logger.info("接入ChanelId为:"+conn.getId() +",redis存储key为:"+conn.getRequest().getSession().getId());
			CometEngine engine = CometContext.getInstance().getEngine();
			engine.sendTo(Const.MSG_CHANEL, engine.getConnection(conn.getId()), "欢迎您,sessionid为:"+conn.getRequest().getSession().getId());
			return true;
		}
	}
	
	class LeftListener extends DropListener {
		public boolean handleEvent(DropEvent anEvent) {
			CometConnection conn = anEvent.getConn();
			if (conn != null) {
				HttpServletRequest request = conn.getRequest();
				redisService.del(request.getSession().getId());
				logger.info("删除ChanelId为:"+conn.getId() +",redis存储key为:"+conn.getRequest().getSession().getId());
				CometEngine engine = CometContext.getInstance().getEngine();
				engine.sendTo(Const.MSG_CHANEL, engine.getConnection(conn.getId()), "删除,sessionid为:"+conn.getRequest().getSession().getId());
			}
			return true;
		}
	}
	
	public void contextDestroyed(ServletContextEvent sce) {
	}
}

	

jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!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">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Comet4J Hello World</title>
<script type="text/javascript" src="js/comet4j.js"></script>
<script type="text/javascript">
function init(){
        var kbDom = document.getElementById('kb');
        JS.Engine.on({
        	start : function(cId, channelList, engine){ 
//				document.getElementById('cid').innerHTML=cId;
				alert('连接已建立,连接ID为:' + cId);  
      	    },  
      		stop : function(cause, cId, url, engine){  
				alert('连接已断开,连接ID为:' + cId + ',断开原因:' + cause + ',断开的连接地址:'+ url);  
      	    },     
			harvetech : function(kb){//侦听一个channel
				kbDom.innerHTML = kb;
            }
        });
        JS.Engine.start('test');
}
</script>
</head>
<body onload="init()">
        comet4j消息推送:<span id="kb">...</span>
</body>
</html>