comet4j java服务端推送消息到web页面实例

简介:       对于页面一直监控,以前都是使用ajax请求即可,但是小并发这做法没多大问题,但是到了大并发就不太合适,如果不想自己写线程来操控就可以偷懒找一些插件,例如comet4j 下面我来演示下如何使用这个插件       先准备需要的工具: comet4j-tomcat6.

      对于页面一直监控,以前都是使用ajax请求即可,但是小并发这做法没多大问题,但是到了大并发就不太合适,如果不想自己写线程来操控就可以偷懒找一些插件,例如comet4j

下面我来演示下如何使用这个插件

      先准备需要的工具:

comet4j-tomcat6.jar(tomcat6的就导入这个)

comet4j-tomcat7.jar(tomcat7的就导入这个)

comet4j.js(页面引入这个js)

具体操作看下面


然后就写个class

package com.shadow.extras.comet4j;

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

import org.comet4j.core.CometContext;
import org.comet4j.core.CometEngine;

public class TestComet implements ServletContextListener {
	private static final String CHANNEL = "test";
	private static final String CHANNEL2 = "test2";

	public void contextInitialized(ServletContextEvent arg0) {
		CometContext cc = CometContext.getInstance();
		cc.registChannel(CHANNEL);// 注册应用的channel
		cc.registChannel(CHANNEL2);

		Thread helloAppModule = new Thread(new HelloAppModule(),
				"Sender App Module");
		// 是否启动
		helloAppModule.setDaemon(true);
		// 启动线程
		helloAppModule.start();

		Thread helloAppModule2 = new Thread(new HelloAppModule2(),
				"Sender App Module");
		// 是否启动
		helloAppModule2.setDaemon(true);
		// 启动线程
		helloAppModule2.start();
	}

	class HelloAppModule2 implements Runnable {
		public void run() {
			while (true) {
				try {
					// 睡眠时间
					Thread.sleep(5000);
				} catch (Exception ex) {
					ex.printStackTrace();
				}
				CometEngine engine = CometContext.getInstance().getEngine();
				// 获取消息内容
				long l = getFreeMemory();
				// 开始发送
				engine.sendToAll(CHANNEL2, l);
			}
		}
	}

	class HelloAppModule implements Runnable {
		public void run() {
			while (true) {
				try {
					// 睡眠时间
					Thread.sleep(2000);
				} catch (Exception ex) {
					ex.printStackTrace();
				}
				CometEngine engine = CometContext.getInstance().getEngine();
				// 获取消息内容
				long l = getFreeMemory();
				// 开始发送
				engine.sendToAll(CHANNEL, l);
			}
		}
	}

	public void contextDestroyed(ServletContextEvent arg0) {

	}

	public long getFreeMemory() {
		return Runtime.getRuntime().freeMemory() / 1024;
	}
}

然后再写个页面


<!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="plugin/comet4j/comet4j.js"></script>
<script type="text/javascript">
function init(){
        var kbDom = document.getElementById('kb');
        var kbDom2 = document.getElementById('kb2');
        JS.Engine.on({
                test : function(aa){//侦听一个channel
                        kbDom.innerHTML = aa;
                },
                test2 : function(bb){
                	kbDom2.innerHTML = bb;
                }
        });
        JS.Engine.start('comet');
}
</script>
</head>
<body onload="init()">
        剩余内存:<span id="kb">...</span>KB <br/>
        剩余内存:<span id="kb2">...</span>KB
</body>
</html>

接着配置下web.xml就ok了

<!-- 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>TestComet</description>
		<listener-class>com.shadow.extras.comet4j.TestComet</listener-class>
	</listener>

最后修改下tomcat的server.xml文件

把protocol参数值改成下面的,因为这是基于nio开发的插件

<Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" redirectPort="8443"/>

测试,很简单就是访问我们刚刚创建的test.html,然后就可以看到内存数值一直自动刷新波动


目录
相关文章
|
19天前
|
安全 Java API
Java Web 在线商城项目最新技术实操指南帮助开发者高效完成商城项目开发
本项目基于Spring Boot 3.2与Vue 3构建现代化在线商城,涵盖技术选型、核心功能实现、安全控制与容器化部署,助开发者掌握最新Java Web全栈开发实践。
202 1
|
18天前
|
存储 前端开发 Java
【JAVA】Java 项目实战之 Java Web 在线商城项目开发实战指南
本文介绍基于Java Web的在线商城技术方案与实现,涵盖三层架构设计、MySQL数据库建模及核心功能开发。通过Spring MVC + MyBatis + Thymeleaf实现商品展示、购物车等模块,提供完整代码示例,助力掌握Java Web项目实战技能。(238字)
149 0
|
2月前
|
JavaScript Java 微服务
现代化 Java Web 在线商城项目技术方案与实战开发流程及核心功能实现详解
本项目基于Spring Boot 3与Vue 3构建现代化在线商城系统,采用微服务架构,整合Spring Cloud、Redis、MySQL等技术,涵盖用户认证、商品管理、购物车功能,并支持Docker容器化部署与Kubernetes编排。提供完整CI/CD流程,助力高效开发与扩展。
330 63
|
19天前
|
存储 Java 关系型数据库
Java 项目实战基于面向对象思想的汽车租赁系统开发实例 汽车租赁系统 Java 面向对象项目实战
本文介绍基于Java面向对象编程的汽车租赁系统技术方案与应用实例,涵盖系统功能需求分析、类设计、数据库设计及具体代码实现,帮助开发者掌握Java在实际项目中的应用。
40 0
|
2月前
|
前端开发 Java 数据库
Java 项目实战从入门到精通 :Java Web 在线商城项目开发指南
本文介绍了一个基于Java Web的在线商城项目,涵盖技术方案与应用实例。项目采用Spring、Spring MVC和MyBatis框架,结合MySQL数据库,实现商品展示、购物车、用户注册登录等核心功能。通过Spring Boot快速搭建项目结构,使用JPA进行数据持久化,并通过Thymeleaf模板展示页面。项目结构清晰,适合Java Web初学者学习与拓展。
189 1
|
4月前
|
NoSQL Java Shell
2025服务端java搭建篇:蜻蜓I即时通讯系统私有化部署深度指南-优雅草卓伊凡|麻子|贝贝
2025服务端java搭建篇:蜻蜓I即时通讯系统私有化部署深度指南-优雅草卓伊凡|麻子|贝贝
184 8
2025服务端java搭建篇:蜻蜓I即时通讯系统私有化部署深度指南-优雅草卓伊凡|麻子|贝贝
|
3月前
|
安全 Java 测试技术
Java 大学期末实操项目在线图书管理系统开发实例及关键技术解析实操项目
本项目基于Spring Boot 3.0与Java 17,实现在线图书管理系统,涵盖CRUD操作、RESTful API、安全认证及单元测试,助力学生掌握现代Java开发核心技能。
112 1
|
3月前
|
缓存 NoSQL Java
Java Web 从入门到精通之苍穹外卖项目实战技巧
本项目为JavaWeb综合实战案例——苍穹外卖系统,涵盖Spring Boot 3、Spring Cloud Alibaba、Vue 3等主流技术栈,涉及用户认证、订单处理、Redis缓存、分布式事务、系统监控及Docker部署等核心功能,助你掌握企业级项目开发全流程。
321 0
|
3月前
|
安全 JavaScript Java
java Web 项目完整案例实操指南包含从搭建到部署的详细步骤及热门长尾关键词解析的实操指南
本项目为一个完整的JavaWeb应用案例,采用Spring Boot 3、Vue 3、MySQL、Redis等最新技术栈,涵盖前后端分离架构设计、RESTful API开发、JWT安全认证、Docker容器化部署等内容,适合掌握企业级Web项目全流程开发与部署。
157 0
|
4月前
|
存储 算法 Java
【Java实例-智慧牌局】Java实现赌桌上的21点
游戏规则:游戏开始时,玩家和庄家各获得两张牌,玩家可以看到自己手中的两张牌以及庄家的一张明牌。玩家需要根据手中的牌面总和,选择“要牌”(Hit)以获取更多牌,或“停牌”(Stand)停止要牌。如果玩家的牌面总和超过21点,即为爆牌,玩家立即输掉游戏。若玩家选择停牌,庄家则开始行动,其策略是当牌面总和小于17点时必须继续要牌。若庄家牌面总和超过21点,则庄家爆牌,玩家获胜。若双方均未爆牌,最终比较牌面总和,更接近21点的一方获胜;若牌面总和相同,则游戏以平局结束。
63 0