首先,无图无真相,先上图:
这是一个基于Comet实现的聊天室Demo,功能类似于QQ群聊。聊天过程中如果有新想消息,那么就需要服务器推送消息到浏览器,所以这里可以使用Comet技术。
Comet一般有两种实现方式:长轮询(long-polling)、流(streaming)。而本文中的这个Demo的实现方式是基于流(streaming),前端使用了一个隐藏的iframe,这也是比较常用的一种方式。不过由于使用iframe流,导致浏览器上面的进度一直在转,这是因为iframe一直在加载的原因,先不要在意这些细节。
Tomcat提供了Comet相关的API,用Servlet实现CometProcessor接口就可以很简单的实现Comet了。
1、准备工作
1.1、首先,需要配置Tomcat连接为NIO,否则无法使用Tomcat Comet。
Tomcat目录下conf/server.xml,protocol更改为org.apache.coyote.http11.Http11NioProtocol:
<Connector connectionTimeout="20000" port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" redirectPort="8443"/>
配置好后启动Tomcat应该是这样:
1.2、在开发过程中,需要用到Tomcat的catalina.jar包,在Tomcat的lib目录下。程序在Tomcat中运行时再去掉。
2、Java后台
2.1、CometServlet
这个Servlet是处理Comet Http长连接的Servlet,这个Servlet实现Tomcat提供的CometProcessor接口,通过event方法来处理Http长连接周期内的多种事件:
BEGIN事件:有新的HTTP连接;
END事件:连接关闭,例如浏览器关闭;
ERROR事件:连接错误,例如timeout。
有关事件更详细介绍在Tomcat官方文档中有:http://tomcat.apache.org/tomcat-7.0-doc/aio.html
public class CometServlet extends HttpServlet implements CometProcessor {
// 所有正在等待响应的HTTP长连接
private ArrayList<HttpServletResponse> connections = nu