`
dreamoftch
  • 浏览: 496594 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

comet 推送 消息 聊天

阅读更多

 

需要的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>

 

然后就可以打开多个浏览器测试了。。。

 

 

分享到:
评论

相关推荐

    ssm.rar_comet_java comet_java comet推送_聊天 JAVA SSM

    在描述中提到的"Java comet服务器推送(聊天)实现代码",很可能包含了这些Comet技术的具体实现,包括服务器端的Servlet代码和可能的客户端JavaScript代码,用于处理推送的逻辑和展示消息。 SSM框架与Comet结合,可以...

    javaweb消息推送 基于comet实现局域网内部通讯(聊天室)demo

    javaweb消息推送 基于comet实现局域网内部通讯(聊天室)demo 功能特性 推送消息广播。 推送定向消息。 提供连接上线前、上线、下线前、下线、发送消息等多种可处理事件。 消息缓存机制,确保长轮询工作模式下不丢失...

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

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

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

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

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

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

    DWR+JAVA进行web消息推送dwr-comet.zip

    总结来说,DWR与Java结合的Web消息推送方案利用了Comet技术,提供了实时、双向的通信能力。通过在后端处理数据推送和前端与服务器的交互,可以构建出高性能、低延迟的实时Web应用。开发者在实际应用中,需根据项目...

    基于Comet推送技术的实时图形控件

    本篇文章将详细探讨基于Comet推送技术实现的asp.net实时图形控件及其特点。 首先,我们需要理解Comet技术。Comet是一种Web通信模式,它打破了传统的HTTP请求-响应模型,允许服务器向客户端主动推送数据,而不是等待...

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

    Java 使用 Comet4j 主动向客户端推送信息是一个常见的实时通信技术,主要应用于构建WebSocket或长轮询等实时交互的应用场景。Comet4j 是一个基于 HTTP 长连接的服务器端框架,它允许服务器端主动向客户端推送数据,...

    DWR3实现服务器端向客户端精确推送消息

    DWR3的消息推送功能在实时应用,如聊天室、股票报价、在线游戏等场景中非常有用。它减少了延迟,提高了用户体验。然而,需要注意的是,由于Comet技术基于长连接,可能会对服务器负载和并发性产生影响,因此在设计和...

    消息推送comet4jjar包

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

    用DWR的comet推,实现多人聊天室

    【标题】: 使用DWR的Comet推送技术创建多人聊天室 【描述】: 本文主要探讨如何通过Spring与Direct Web Remoting (DWR)框架的整合,利用Comet技术来构建一个无需刷新页面的多人在线聊天室。Comet是一种实现服务器到...

    web推送 comet技术

    最后,部署项目到Tomcat7服务器,启动服务器,通过浏览器访问项目,测试Comet推送功能是否正常工作。 在实际应用中,Comet技术的性能和效率会受到服务器负载、网络状况以及浏览器支持的影响。因此,在设计和实现...

    dwr3推送消息

    在DWR3中,"推送消息"功能是其特性之一,它使得服务器能够主动向客户端推送数据,而不仅仅是响应客户端的请求。这种技术通常被称为Comet或长轮询,可以用于实现实时通信,如聊天应用、股票报价、在线游戏等场景。 ...

    用DWR comet+Spring实现服务器推送的例子--网页聊天室

    标题中的“用DWR comet+Spring实现服务器推送的例子--网页聊天室”涉及到的是Web开发中的实时通信技术。DWR(Direct Web Remoting)是一个开源Java库,它允许JavaScript在浏览器和服务器之间进行直接的、安全的远程...

    C#消息推送源码

    本文将深入探讨“C#消息推送源码”这一主题,结合标签“dwr”,“comet”,“消息推送”,“反推送”以及“源码”,来解析相关的知识点。 首先,让我们了解一下消息推送的概念。消息推送是网络应用程序中一种技术,...

    DWR推送技术大全 dwr推送聊天实例

    - **聊天室接口**:服务器端定义了一个或多个处理聊天消息的Java类,这些类提供了添加、获取和广播消息的方法。 - **JavaScript接口**:DWR自动生成了与服务器端接口对应的JavaScript API,前端可以直接调用这些API...

    comet4j推送

    Comet4j是一种基于Java的实时通信框架,它主要用于实现服务器向客户端的高效、低延迟的数据推送技术。在Web开发中,传统的HTTP协议是请求-响应模式,即客户端发起请求,服务器响应,然后连接关闭。然而,对于需要...

    消息推送并在屏幕右下角弹窗、类QQ弹窗

    在IT行业中,消息推送和屏幕右下角的弹窗功能是常见的用户交互设计,尤其在即时通讯软件如QQ中,这种设计使得用户可以及时获取新消息通知。本文将深入探讨如何实现这样的功能,并以"comet4j"作为示例进行讲解。 1. ...

    comet4j推送Demo

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

    Comet4j推送

    Comet4j是一种基于Java的 comet 技术框架,它为开发者提供了一种高效、便捷的服务器向客户端实时推送数据的方式。Comet技术是Web应用中实现双向通信的一种策略,通常用于构建实时交互的Web应用,如聊天室、股票行情...

Global site tag (gtag.js) - Google Analytics