需要的jar包以及基础的配置参考:
tomcat comet 推送 技术 入门
直接切入正题:
首先引入tomcat的lib目录下的jar包:
catalina.jar,servlet-api.jar
另外要修改tomcat的server.xml,将protocal="http/1.1"什么的修改为:
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" redirectPort="8443" />
这样就让tomcat支持推送功能了
首先是servlet(带有注释):
package nio.comet; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.catalina.CometEvent; import org.apache.catalina.CometProcessor; public class ChatCometServlet extends HttpServlet implements CometProcessor{ private static final long serialVersionUID = 1L; private List<CometEvent> events = new ArrayList<CometEvent>(); @Override public void event(CometEvent event) throws IOException, ServletException { HttpServletRequest request = event.getHttpServletRequest(); String path = request.getRequestURI(); if(path.indexOf("setComet") != -1){ //发送消息的请求 String message = request.getParameter("message"); //遍历所有的CometEvent,将消息发送出去 synchronized(events){ //使用list的遍历器 Iterator<CometEvent> iterator = events.iterator(); CometEvent e = null; while(iterator.hasNext()){ e = iterator.next(); HttpServletResponse res = e.getHttpServletResponse(); //设置响应的编码和类型 res.setCharacterEncoding("utf-8"); res.setContentType("text/plain"); PrintWriter writer = res.getWriter(); writer.write(message); writer.flush(); //一定要调用list保存的CometEvent对象的close方法关闭,这样才可以及时将消息推送出去 e.close(); //删除的时候要使用iterator的删除方法,否则可能会引发cuncurrentModifyException iterator.remove(); } } //最后关闭当前请求的CometEvent event.close(); return; }else if(path.indexOf("getComet") != -1){ //获取消息的请求 if(event.getEventType() == CometEvent.EventType.BEGIN){ //begin阶段,设置超时时间,并将CometEvent对于保存到list中,其他阶段均返回ERROR(简单处理) event.setTimeout(20000); synchronized(events){ events.add(event); } return; }else if(event.getEventType() == CometEvent.EventType.END){ synchronized(events){ HttpServletResponse res = event.getHttpServletResponse(); res.setCharacterEncoding("utf-8"); res.setContentType("text/plain"); PrintWriter writer = res.getWriter(); writer.write("ERROR"); writer.flush(); event.close(); events.remove(event); } return; }else if(event.getEventType() == CometEvent.EventType.ERROR){ synchronized(events){ HttpServletResponse res = event.getHttpServletResponse(); res.setCharacterEncoding("utf-8"); res.setContentType("text/plain"); PrintWriter writer = res.getWriter(); writer.write("ERROR"); writer.flush(); event.close(); events.remove(event); } return; }else if(event.getEventType() == CometEvent.EventType.READ){ synchronized(events){ HttpServletResponse res = event.getHttpServletResponse(); res.setCharacterEncoding("utf-8"); res.setContentType("text/plain"); PrintWriter writer = res.getWriter(); writer.write("ERROR"); writer.flush(); event.close(); events.remove(event); } return; } } } }
然后再web.xml中配置servlet:
<servlet> <servlet-name>mycomet</servlet-name> <servlet-class>nio.comet.ChatCometServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>mycomet</servlet-name> <url-pattern>/comet/*</url-pattern> </servlet-mapping>
然后就是页面了(里面需要引入jquery):
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'chat.jsp' starting page</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"> <script type="text/javascript" src="upload/js/jquery.min.js"></script> <script type="text/javascript"> $(function(){ //页面加载完之后就发起读取消息的长连接 read(); }); //发送消息 function send(){ var f = document.forms['cometForm']; $.post("comet/setComet",$(f).serialize()); } //读取消息 function read(){ $.ajax({ type: "POST", url: "comet/getComet", success: function(data){ if("ERROR" != data){ $("#show").html($("#show").html()+'<br/>'+data); } read(); } }); } </script> </head> <body> <form name="cometForm"> <input type="text" name="message"/> <input type="button" value="send" onclick="send();"/> </form> 消息: <div id="show"></div> </body> </html>
然后就可以打开多个浏览器测试了。。。
相关推荐
Java comet服务器推送(聊天)实现代码。
javaweb消息推送 基于comet实现局域网内部通讯(聊天室)demo 功能特性 推送消息广播。 推送定向消息。 提供连接上线前、上线、下线前、下线、发送消息等多种可处理事件。 消息缓存机制,确保长轮询工作模式下不丢失...
NULL 博文链接:https://frank59.iteye.com/blog/1455050
comet4j_7.jar和comet4j-0.0.2.js一个免费的做推送以及聊天用到的包,网上大部分都是comet4j_6,赚点分
本资源是一个简单的comet4j工程demo,想了解comet4j及时推送服务框架的可以下载了解一下
使用dwr的comet技术来实现无刷新的多人聊天室。让服务端监听发送消息事件,通过scriptsession来获取所有的访问者。在像访问者中推送信息。
SingleR聊天推送示例源码 源码描述: 一、源码介绍 SignalR 的实现机制与 .NET WCF 或 Remoting 是相似的,都是使用远程代理来实现。在具体使用上,有两种不同目的的接口:PersistentConnection 和 Hubs,其中 ...
本程序采用comet技术实现,达到信息及时显示到各个请求的客户端,目前已完成多人聊天,在局域网测试ok。15个人同时测试没有问题。可以达到信息及时的分发到各个客户端。基本上说可以完成ajax隔多少秒去请求数据的...
使用 DWR+Spring 实现服务器推送的 网页聊天程序
C#实现基于http长连接“服务器推”-Comet技术 很多应用譬如监控、即时通信、即时报价系统都需要将后台发生的变化实时传送到客户端而无须客户端不停地刷新、发送请求。 本项目基于 AJAX 的长轮询方式实现。 ...
若要实现聊天室、WEBQQ、在线客服、邮箱等这些即时通讯的应用,就要用到“ 服务器推送技术(Comet)”。 传统的AJAX轮询方式,客服端以用户定义的时间间隔去服务器上查询最新的数据。种这种拉取数据的方式需要很短的...
既能应对当前开发工作量,也确保了后期无缝切换后端推送服务案例项目目录简介api: http api服务代码 (负责组装/验证参数 跳转到聊天页面的接口,接收新消息的接口)comet: 推送服务代码 (负责下发消息, 客户端通过http...
支持单个、多个、单房间以及广播消息推送 支持单个Key多个订阅者(可限制订阅者最大人数) 心跳支持(应用心跳和tcp、keepalive) 支持安全验证(未授权用户不能订阅) 多协议支持(websocket,tcp) 可拓扑的架构...
ChitChat 具有以下特点: 基于 Websocket 或 Comet 的基于推送的通信多个房间,可以临时添加客户端名称可以更改,并将推送给其他客户端回发用于获取已知房间列表和房间中的最新消息默认为 public 访问,可以添加...
架构图初步图以下Comet层,Logic层,Job层都可以灵活扩展机器特性分布式,可拓扑的架构支持制服,房间按压心跳支持(gorilla / websocket内置)基于redis做消息推送轻量级持续迭代...部署安装go get -u github....
什么是websocket ...看了上面链接的同学肯定对过去怎么低效率高消耗(轮询或comet)的做此事已经有所了解了...服务器可以主动向客户端推送消息,而不用客户端去查询 关于概念和好处,网上到处都是,不再赘述,简单看看其
Orbited on Rails是一个插件,可让您的Rails应用程序轻松使用Comet向用户推送更改。 ,也称为反向Ajax和服务器推送(以及其他昵称),是一种无需轮询即可将数据推送给用户的方法。 Orbited是此方法的一种实现,该...
一:iframe + 服务器推技术comet(反向ajax,即服务器向浏览器推送数据) 二:ajax持久连接 + 长轮询 客服端采用第一种方式:iframe + 服务器推技术 思路: 1:新建comentbyiframe.php 该用文件使用while(true)一直连接...
与传统的MVC模型请求必须从客户端发起由服务器响应相比,使用反向Ajax能够模拟服务器端主动向客户端推送事件从而提高用户体验。本文将分两个部分讨论反向Ajax技术,包括:Comet和WebSocket。文章旨在演示如何实现...