`

Tomcat 开发Comet实例

阅读更多

1.Tomcat6&Comet的简要介绍

 

Comet技术的悄然流行,Jetty在比较早地支持了Comet,提供了Comet 的Servlet,同样从Tomcat6开始,Comet已经在Tomcat的标准Servlet中开始支持了,这是个好事情,毕竟我们有越来越多的选择了。

 

可喜的是Comet技术,已经定义在Servlet3.0规范中,到时候,我们代码的移植性更好了。

 

可惜的是Tomcat提供了几个Sample都不能运行,在这里需要批评一下Tomcat的开发者们了,笔者花了几天看了那个实例代码,代码写得确实有点问题,大量的同步关键字,本身其实用一个简单的例子说明就可以了,何必杀鸡用牛刀。

 

Tomcat的comet原理其实同样很简单,它无非就是做了一件事情,它允许servlet执行完毕后的response没有被回收,我们只要拿到这个Reponse的引用并保存起来,就可以随时从Server向Client端Push数据了。

 

Tomcat提供了CometProcessor接口,有这种特定标记的Servlet,Tomcat会做特殊处理,Tomcat不会把它当做普通Servlet实行完毕后,会回收request和response。


2.实战

 

本文实现了一个server 定时push一个随机数到client端,此例查询了大量的实例,经过笔者验证,在IE和FireFox下都可以运行。

 

运行此例,需要下面配置:

 

1) Tomcat要求支持Comet,必须使用NIO或者APR的方式,因此,修改Tomcat/conf/server.xml

    <Connector port="9000" executor="tomcatThreadPool"  protocol="org.apache.coyote.http11.Http11NioProtocol" 
               connectionTimeout="20000"  maxThreads="150"
               redirectPort="8443"  maxKeepAliveRequests="1"/>

 

2)Tomcat版本要求6.0.16以上,最好使用最新的版本

 

3) 修改附件中源码里面的web目录下的comet-compatible.jsp文件,把里面涉及IP和端口的url,改成你机器的ip地址和端口

 

4) 测试运行:http://ip:port/contextName/comet-compatible.jsp

 

请耐心等数秒钟,随机数开始从server push到client端了

 

 

源码见附件,附件的URL如下:

 

http://dl.iteye.com/topics/download/ee28df9d-d838-3572-be73-dbf06c11080f

 

注:作者本着负责的态度,让大家更快的学习新东西,欢迎大家有问题,给我留言,我一定及时回复

 

 

 

 

分享到:
评论
17 楼 tieganxiaosheng 2014-08-14  
非常感谢楼主!怎样在数据更新完毕后关闭这个连接呢?
16 楼 tankerxp 2013-08-12  
是不是 部署在eclipse上的tomcat wtp方式的 就不能运行
15 楼 xsgkaka 2013-01-05  
debbykindom 写道
本人已经测试过,附件代码基本没有问题,就是有几点要注意。
1.修改comet-compatible.jsp中的ip地址,如改为127.0.0.1,端口9000不用改。
2.contextPath需设置为“cs”。
3.访问时使用http://127.0.0.1:8080/cs/..的形式,不要使用
http://localhost:8080/cs/..的形式。
但测试时发现有一个问题,首次访问comet-compatible.jsp时一切正常,数据能正常更新,控制台输出亦无异常;然而一旦刷新该页面则会出现NullPointerException,然后页面无数据显示。


我也是页面一刷新服务端就会报错
14 楼 kangguolong 2012-02-19  
到底是个什么个流程??
访问comet-compatible.jsp只是在后台输出
org.apache.catalina.connector.ResponseFacade@c9d92c buffer size=====8192
访问另外的两个页面然后单击GO按钮也只是后台不停的输出天气消息,前台没有任何的输出????????????????
13 楼 kangguolong 2012-02-19  
我的也是在后台不停的输出org.apache.catalina.connector.ResponseFacade@383118 buffer size=====8192
而已,前台界面什么也没有。
12 楼 luckyzhw 2012-02-17  
使用的是Tomcat 7,在Firefox里面,执行go,看到后台有打印:
org.apache.catalina.connector.ResponseFacade@383118 buffer size=====8192
org.apache.catalina.connector.ResponseFacade@383118 buffer size=====8192

但是在Firefox里面没有看到任何反应,不过通过Firebug,可以看到不断有reponse收到反应消息。不知何故,在firefox的页面就是看不到内容。

Chrome也是一样。

IE也是一样,怪哉。
11 楼 joe_zhjiang 2011-11-04  
我也跑过代码,但ajax还是重复访问后台。求解答,因为event.getEventType()状态会变成error.
10 楼 wzxf536 2010-12-29  
博主,我现在android系统上需要用到这个东西,希望能交流下,看见回我Email:wzxf536#163.com #改成@就可以了,谢谢~
9 楼 yicw 2010-12-12  
这个例子在IE下跑不起来,把comet-compatible.jsp中第30行改成:
comet.connection.write("<script>document.domain = '"+document.domain+"'");
就可以了。
8 楼 yangcaifeng_14 2010-09-16  
yangcaifeng_14 写道
我引用了如下包,可以跑起来了
catalina-6.0.20.jar
jdom.jar
org.apache.felix.http.bundle-2.0.2.jar
rome-1.0RC2.jar
servlet-api.jar


AsyncContext async = request.startAsync(request, response)没起作用
7 楼 yangcaifeng_14 2010-09-16  
我引用了如下包,可以跑起来了
catalina-6.0.20.jar
jdom.jar
org.apache.felix.http.bundle-2.0.2.jar
rome-1.0RC2.jar
servlet-api.jar
6 楼 yangcaifeng_14 2010-09-16  
debbykindom 写道
本人已经测试过,附件代码基本没有问题,就是有几点要注意。
1.修改comet-compatible.jsp中的ip地址,如改为127.0.0.1,端口9000不用改。
2.contextPath需设置为“cs”。
3.访问时使用http://127.0.0.1:8080/cs/..的形式,不要使用
http://localhost:8080/cs/..的形式。
但测试时发现有一个问题,首次访问comet-compatible.jsp时一切正常,数据能正常更新,控制台输出亦无异常;然而一旦刷新该页面则会出现NullPointerException,然后页面无数据显示。

去掉jsp-api.jar可以解决空指针异常
5 楼 anyonefeng 2010-07-05  
楼主你这个我怎么始终运气不起啊    能不能把你这个项目的源代码发给我谢谢anyonefeng@gmail.com
4 楼 debbykindom 2010-06-21  
本人已经测试过,附件代码基本没有问题,就是有几点要注意。
1.修改comet-compatible.jsp中的ip地址,如改为127.0.0.1,端口9000不用改。
2.contextPath需设置为“cs”。
3.访问时使用http://127.0.0.1:8080/cs/..的形式,不要使用
http://localhost:8080/cs/..的形式。
但测试时发现有一个问题,首次访问comet-compatible.jsp时一切正常,数据能正常更新,控制台输出亦无异常;然而一旦刷新该页面则会出现NullPointerException,然后页面无数据显示。
3 楼 matychen 2010-06-11  
建议楼主整个能编译的,没错误的附件上来,你这样的附件确实比较闹心。。。
2 楼 tomyz0223 2010-06-06  
依赖的包,包括,tomcat 6/lib目录下的jsp-api.jar,servlet-api.jar,catalina.jar,把这三个包加到你的classpath下面,仍然会有两个类不能编译通过,其实关系不大,因为我在本例中运行的是CometSample这个类,你直接把能编译通过的包直接放到tomcat/webapp下面查看结果就可以了
1 楼 kevinchj 2010-06-06  
非常感谢楼主。请问得用JavaEE6的jar包吗?不然又很多class找不到,如javax.servlet.annotation.WebServlet;等。但是用了JEE6的jar包后,放问jsp页面又有错误。闹心的很,不知道对jar包对有什么要求配置,谢谢

相关推荐

Global site tag (gtag.js) - Google Analytics