`
edisonlv2010
  • 浏览: 43505 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

使用Comet4j实现消息推送

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

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

view:hello.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>comet</title>
<script type="text/javascript" src="/comet4j_demo/js/jquery-1.8.0.min.js"></script>
<script type="text/javascript" src="/comet4j_demo/js/comet4j.js"></script>

<script type="text/javascript">
 
$(function(){
    JS.Engine.on('hello', function(text){ 
    	$("#targetDiv").append("<span id='msgSpan' style='color:red'>" + text + "</span>");
    });
    
    <%
    	String userId = request.getParameter("userId");
 		session.setAttribute("currentUserId", userId);
    %>

    JS.Engine.start('conn');
});

$(document).ready(function(){
	$("#targetDiv").bind("click", function(){
		//有新消息
		if ($(this).find("span").length > 0) {
			$("div > span").remove();
		}
	});
}); 

</script>
</head>
<body>
	<table border="1" width:600px>
		<tr>
			<td>hello comet</td>
			<td><div id="targetDiv" style="width:300px"></div></td>
		</tr>
	</table>
</body>
</html>


service code:NewMsgCollector.java

public class NewMsgCollector extends ConnectListener implements ServletContextListener {

	private static final String CHANNEL = "hello";

	@Override
	public void contextInitialized(ServletContextEvent contextEvent) {
		//注册应用的channel
		CometContext context = CometContext.getInstance();
		context.registChannel(CHANNEL);
		
		//添加监听器
		CometEngine engine = CometContext.getInstance().getEngine();
		engine.addConnectListener(this);
	}
	
	@Override
	public void contextDestroyed(ServletContextEvent contextEvent) {}

	@Override
	public boolean handleEvent(ConnectEvent connEvent) {
		final CometConnection conn = connEvent.getConn();
		
		//建立连接和用户的关系
		doCache(conn);

		final String connId = conn.getId();

		/*模拟业务逻辑*/
		Timer timer = new Timer(true);
		TimerTask task = new TimerTask() {
			@Override
			public void run() {
				CometEngine engine = CometContext.getInstance().getEngine();
				//推送到所有客户端
				//engine.sendToAll("hello", connId + " - you have " + ((int)(Math.random() * 9) + 1) + " new message <br />");

				if (CacheManager.getContent(connId).isExpired()) {
					doCache(conn);
				}

				if (simulateService(String.valueOf(CacheManager.getContent(connId).getValue()))) {
					//推送到指定的客户端
					engine.sendTo(CHANNEL, engine.getConnection(connId), CacheManager.getContent(connId).getValue()
							+ " - you have " + ((int) (Math.random() * 9) + 1) + " new message <br />");
				}
			}
		};
		timer.schedule(task, 10000, (1000 * 5));
		return true;
	}

	private void doCache(final CometConnection conn) {
		Object userId = conn.getRequest().getSession().getAttribute("currentUserId");
		if (userId != null) {
			CacheManager.putContent(conn.getId(), String.valueOf(userId), CacheConstant.EXPIRE_AFTER_ONE_HOUR);
		}
	}

	/**
	 * 模拟业务
	 * 返回true,false
	 * true即表示需要推送消息,false即不需要推送
	 */
	private boolean simulateService(String id) {
		int flag = (int) Math.round(Math.random());
		if (flag == 0) {
			System.out.println(id + " - no messge...");
			return false;
		}
		System.out.println(id + " - messge is coming...");
		return true;
	}
}


web.xml


	
<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>/conn</url-pattern>
</servlet-mapping>

<listener>
<description>NewMsgCollector</description>
<listener-class>NewMsgCollector</listener-class>
</listener>





  • 大小: 62.3 KB
分享到:
评论
4 楼 wunan1402 2015-01-04  
public class Cache { 
     private String key; 
     private Object value; 
     private long timeOut; 
     private boolean expired; 
     public Cache() { 
             super(); 
     } 
              
     public Cache(String key, String value, long timeOut, boolean expired) { 
             this.key = key; 
             this.value = value; 
             this.timeOut = timeOut; 
             this.expired = expired; 
     } 
 
     public String getKey() { 
             return key; 
     } 
 
     public long getTimeOut() { 
             return timeOut; 
     } 
 
     public Object getValue() { 
             return value; 
     } 
 
     public void setKey(String string) { 
             key = string; 
     } 
 
     public void setTimeOut(long l) { 
             timeOut = l; 
     } 
 
     public void setValue(Object object) { 
             value = object; 
     } 
 
     public boolean isExpired() { 
             return expired; 
     } 
 
     public void setExpired(boolean b) { 
             expired = b; 
     } 
3 楼 Mislhy 2014-12-25  
Cache是要导入那个包??
2 楼 wunan1402 2014-10-21  
我来给他补充完整吧,我也是猜出来的
CacheManager.java
import java.util.Date; 
import java.util.HashMap; 
 
/**
* @author HK
*
* @date 2011-2-15 下午09:40:00
*/ 
public class CacheManager { 
     
     private static HashMap cacheMap = new HashMap(); 
 
     /**
      * This class is singleton so private constructor is used.
      */ 
     private CacheManager() { 
             super(); 
     } 
 
     /**
      * returns cache item from hashmap
      * @param key
      * @return Cache
      */ 
     private synchronized static Cache getCache(String key) { 
             return (Cache)cacheMap.get(key); 
     } 
 
     /**
      * Looks at the hashmap if a cache item exists or not
      * @param key
      * @return Cache
      */ 
     private synchronized static boolean hasCache(String key) { 
             return cacheMap.containsKey(key); 
     } 
 
     /**
      * Invalidates all cache
      */ 
     public synchronized static void invalidateAll() { 
             cacheMap.clear(); 
     } 
 
     /**
      * Invalidates a single cache item
      * @param key
      */ 
     public synchronized static void invalidate(String key) { 
             cacheMap.remove(key); 
     } 
 
     /**
      * Adds new item to cache hashmap
      * @param key
      * @return Cache
      */ 
     private synchronized static void putCache(String key, Cache object) { 
        cacheMap.put(key, object); 
     } 
 
     /**
      * Reads a cache item's content
      * @param key
      * @return
      */ 
     public static Cache getContent(String key) { 
              if (hasCache(key)) { 
                     Cache cache = getCache(key); 
                     if (cacheExpired(cache)) { 
                             cache.setExpired(true); 
                     } 
                     return cache; 
              } else { 
                      return null; 
              } 
     } 
 
     /**
      * 
      * @param key
      * @param content
      * @param ttl
      */ 
     public static void putContent(String key, Object content, long ttl) { 
             Cache cache = new Cache(); 
             cache.setKey(key); 
             cache.setValue(content); 
             cache.setTimeOut(ttl + new Date().getTime()); 
             cache.setExpired(false); 
             putCache(key, cache); 
     } 
      
     /** @modelguid {172828D6-3AB2-46C4-96E2-E72B34264031} */ 
     private static boolean cacheExpired(Cache cache) { 
             if (cache == null) { 
                     return false; 
             } 
             long milisNow = new Date().getTime(); 
             long milisExpire = cache.getTimeOut(); 
             if (milisExpire < 0) {                // Cache never expires  
                     return false; 
             } else if (milisNow >= milisExpire) { 
                     return true; 
             } else { 
                     return false; 
             } 
     } 
 

CacheConstant.java
public class CacheConstant {

public static long EXPIRE_AFTER_ONE_HOUR = 0; //你自己调整这个时间
}
页面地址要这么写
http://localhost:8080/comet/hello.jsp?userId='ceshi'
然后鼠标点击右边的td,过几秒就有信息了
1 楼 abio1023 2013-08-12  
少了CacheManager 类

相关推荐

    comet4j 自己写的消息推送 觉得实用

    【标题】"comet4j 自己写的消息推送 觉得实用" 提示我们讨论的是一个自定义实现的基于 Comet4j 的消息推送系统。Comet4j 是一个开源的 Java 框架,用于实现实时的、双向的、基于 HTTP 长连接的消息推送服务,它解决...

    javaweb实现后台向前台的消息推送 comet4j

    本示例介绍的是如何使用Comet4j这个第三方库来实现后台到前台的消息推送功能。Comet4j是一个专门用于JavaWeb应用的长连接通讯框架,它简化了基于Comet技术的实时通信实现。 首先,我们要理解Comet技术。Comet是一种...

    java 使用 comet4j 主动向客户端推送信息 简单例子

    综上所述,Java 使用 Comet4j 实现主动向客户端推送信息是通过建立长连接,利用 Comet4j 框架提供的接口和方法来实现实时通信。这个技术在实时聊天、股票行情、在线游戏等需要实时更新信息的场景中有着广泛的应用。

    comet4j 服务端向浏览器实时推送消息(支持指定用户推送)

    【标题】"comet4j 服务端向浏览器实时推送消息(支持指定用户推送)" 描述了一种技术方案,用于实现在服务器与浏览器之间进行实时通信,特别强调了能够针对性地向特定用户推送消息。这一功能在现代Web应用中非常重要,...

    comet4j 所需js以及comet4j-tomcat6.jar、comet4j-tomcat7.jar包

    Comet4j是一种基于Java的实时通信框架,它利用了HTTP长连接技术,实现了服务器向客户端的高效、低延迟的消息推送。在这个压缩包中,包含了Comet4j框架运行所必需的一些关键组件。 首先,`comet4j.js`是Comet4j的...

    comet4j向客户端推送

    Comet4j是一种Java技术,用于实现在服务器端向客户端进行消息推送的功能。在Web开发中,传统的HTTP协议是基于请求-响应模型的,即客户端发起请求,服务器响应后连接关闭,这使得实时通信变得复杂。而Comet4j正是为了...

    comet4j推送

    "comet4j.jar"是Comet4j框架的Java库,包含了所有必要的类和接口,用于在服务器端实现推送逻辑。开发者可以将这个库引入到他们的Java项目中,以便调用Comet4j提供的API,创建和管理推送服务。另一方面,"comet4j.js...

    服务器推送技术之comet4j资源包

    Comet4j就是一种基于Java实现的服务器推送技术框架,旨在简化实时Web应用的开发过程。本资源包包含了实现Comet4j功能所需的关键组件,包括`comet4j.js`脚本文件和`comet4j-tomcat7.jar`服务器端库。 首先,让我们...

    comet4j推送Demo

    标题"comet4j推送Demo"表明这是一个使用Comet4j库创建的示例项目,目的是展示如何在Tomcat7环境下实现服务器推送功能。Tomcat7是一个广泛使用的开源Servlet容器,它支持Servlet 3.0规范,这为Comet4j提供了运行环境...

    消息推送comet4jjar包

    标题中的“消息推送comet4jjar包”指的是一个用于实现服务器向客户端实时推送消息的框架,主要针对的是IE8及以上的浏览器。Comet4j是这个框架的名称,它是一个基于Java技术构建的长连接通信框架,适用于需要双向通信...

    comet4j实例

    Comet4j是一个Java库,专门用于实现Comet技术,这是一种服务器推送技术,允许服务器向客户端实时推送数据,而不仅仅是响应客户端的请求。在Web应用中,这种技术常用于实现聊天室、股票报价、在线游戏等实时交互功能...

    java 使用 comet4j 主动向客户端推送GPS信息的例子

    基于服务器推送框架 Comet4J ,后台模拟实时生成 gps 坐标信息然后再推送到前端页面显示。...这是客户端主动向服务器发起请求的方式,而采用 comet4j框架来实现正好相反,是服务器主动向客户端来推送消息。

    comet4j简单工程demo

    Comet4j是一个基于Java开发的实时通信框架,主要用于实现服务器向客户端的长连接推送服务。在Web应用中,传统的HTTP...通过分析和运行这个示例,你可以深入学习如何在实际项目中利用Comet4j实现高效的实时通信功能。

    Comet4j推送

    3. 实现推送逻辑:在Servlet中,你需要定义一个处理函数来处理来自客户端的请求。当有新的数据需要推送到客户端时,调用Comet4j提供的API来发送数据。 4. 客户端连接:在客户端,使用JavaScript或者其他前端技术...

    comet4j使用方法

    Comet4J通过简化Comet技术的使用,使得开发者能够轻松实现服务器到客户端的实时数据推送。在客户端,通过JavaScript与Comet4J引擎交互,监听通道并处理接收到的数据。而在服务端,注册通道,创建应用模块并运行,...

    comet4j服务器推可运行DEMO

    Comet4j是一款基于Java平台的服务器推送技术框架,它主要设计用于实现实时的、双向的通信,使得服务器能够主动向客户端推送数据,而不仅仅局限于传统的HTTP请求响应模式。在Web开发中,这种技术可以极大地提升用户...

    comet4j-tomcat7后台信息推送jar包

    在这个场景中,"comet4j-tomcat7后台信息推送jar包"是一个专门为Tomcat7服务器设计的实现Comet技术的组件。 Tomcat7是Apache软件基金会的Apache Tomcat服务器的一个版本,它是一个开源的、实现了Java Servlet和Java...

    comet4j做的一个推送demo

    先进入login.jsp通过名字登陆,然后可以发邮件一个框输内容一个框输想收件人id

    Comet4j完整demo

    【Comet4j完整demo】是一个演示项目,它展示了如何使用Comet4j技术与Tomcat7集成,实现高效的服务器推送消息功能。Comet4j是一个开源的Java库,专门设计用于处理长连接(Long-Polling)通信,从而允许服务器主动向...

    comet4j.js+comet4j-tomcat7jar包资源

    - 使用JavaScript调用Comet4J API,如`Comet4J.connect()`来建立连接,`Comet4J.send()`发送数据,以及注册事件监听器来处理服务器推送的消息。 4. 测试和调试: 启动Tomcat服务器,访问你的Web应用,确保客户端...

Global site tag (gtag.js) - Google Analytics