Comet学习笔记(一)Tomcat与Comet
Comet学习笔记(一)Tomcat与Comet
近来由于毕业设计,一直在忙于comet技术的研究,有了一些心得和想法,特来与大家分享。
Comet技术被称为下一代Ajax技术,主要通过实现server push来解决ajax需要定时频繁发送请求的问题。
通过Comet技术,客户端所需要的response信息不再需要主动的去索取,而是在服务器端以event的形式推至客户端。
Comet技术常见的实现方式
streaming和long polling
long poll:HTTP的连接保持,直到server端一个事件触发或者到达timeout事件。client端在收到response消息后,一个新的HTTP请求会立刻开放。通过这种方式,server端可以将数据在任何时候push到客户端。
streaming:在streaming方式中,HTTP的连接是始终保持的,即使客户端收到响应,HTTP连接也不断开。
Tomcat与Comet
在Tomcat 6中,增加了对Comet的支持,但是其自带例子(/webapps/examples/jsp/chat)有很多问题,没有运行成功,怀疑该例并不完整(我的版本Tomcat 6.0.16),经过学习和研究,发现了一些问题,希望能给仍然奋战在其中的朋友一些帮助。
前期准备:使用tomcat提供的comet api之前,需要增加对NIO的支持,配置nio可是相当方便,要做的仅仅是在server.xml里边修改connector:
<connector protocol="org.apache.coyote.http11.Http11NioProtocol" port="8080" redirectport="8443" connectiontimeout="20000">
Tomcat 6提供了CometProcessor和CometEvent接口,具体功能和操作不再赘述,详情请见http://tomcat.apache.org/tomcat-6.0-doc/aio.html。注意:实现CometProcessor接口后不用在servlet中写doGet,doPoset方法,所有事件在BEGIN,READ,END,ERROR中实现。
简单的Comet servlet代码示例:

1 import java.io.*;
2 import javax.servlet.ServletException;
3 import javax.servlet.http.*;
4 import org.apache.catalina.CometEvent;
5 import org.apache.catalina.CometProcessor;
6 import org.apache.catalina.CometEvent.EventType;
7
8 public class cometServlet extends HttpServlet implements CometProcessor {
9
10 public void event(CometEvent e) throws IOException, ServletException {
11 if(e.getEventType() == EventType.BEGIN) {
12 // fill in code handling here
13 HttpServletResponse response = e.getHttpServletResponse();
14 PrintWriter out = response.getWriter();
15 out.write("Hello world");
16 out.flush();
17 //System.out.println("message sent");
18 }
19 if(e.getEventType() == EventType.READ) {
20 // fill in code handling here
21 }
22 // and continue handing other events
23 }
24 }
在此源代码中,仅完成向客户端发送Hello World字符串的功能,关键点,out.flush()不可缺少,以往在写ajax程序的时候,往往忽略写这句话,但这里如果不写,客户端无法收到响应文字。由于tomcat采用streaming的方式实现comet,不知是否不加这句话的时候,客户端不知道你的消息已经结束,而始终处于一个等待的状态(如果您有更专业的解释,请指教)。
服务器端javascript相关代码:

1 <script>
2 function CometEx() {
3 var request = new XMLHttpRequest();
4 request.open("GET", 'http://localhost:8080/cometEx/cometServlet', true);
5 request.onreadystatechange = function() {
6 if (request.readyState == 3 && request.status == 200) {
7 alert(request.responseText);
8 }
9 }
10 request.send(null);
11 }
12 </script>
| 标签: 杂谈 | 
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
redirectPort="8443" />
接着,写一个测试类
public class test extends HttpServlet implements CometProcessor{
public void event(CometEvent arg0) throws IOException, ServletException {
// TODO Auto-generated method stub
}
}
访问这个类的时候,出现
HTTP Status 405 - HTTP method GET is not supported by this URL
的错误.
请问,是不是我的server配置不对.还是需要servlet3.0才行?
------------------------------------------------------------------------------------------------------------------
问题补充:
谢谢,tomcat的comet是不需要doGet,好象实现Comet...会另做处理.
你可以去他的官方网站(tomcat6.0以上)看看comet
------------------------------------------------------------------------------------------------------------------
问题补充:
建议自己把HTTP Status 405 - HTTP method GET is not supported by this URL百度google下,然后自己尝试改,说不定还能自己学到很多!
代码,我差不多都已经发出来,就差一个HTML文件代码没有发了.
------------------------------------------------------------------------------------------------------------------
问题补充:
呵呵.我也是昨天看到,根据网络上和官方的说明搞了个例子,不过,运行不起来.目前我用fushlet.
------------------------------------------------------------------------------------------------------------------
问题补充:
connectionTimeout="20000"
redirectPort="8443" /> ;
可是为什么tomcat启动的时候提示:警告: No rules found matching "Server/Service/connector".;
还有就是修改成上面的配置后,为什么无法访问了呢,是不是还有其他配置呀?
警告暂时可以忽略掉.能保证例子运行成功再说.
------解决方案--------------------------------------------------------
这个错误说明你的servlet没有重写doGet方法呀
------解决方案--------------------------------------------------------
你贴的代码太少了,很难找到问题
建议自己把HTTP Status 405 - HTTP method GET is not supported by this URL百度google下,然后自己尝试改,说不定还能自己学到很多!
------解决方案--------------------------------------------------------
哦,刚才没好好看,不好意思,呵呵,我对comet不是很熟悉,不过好像和AJAX解决的问题差不多哦,要是这样的话,jsp页面应该用异步提交,不能用form表单,好像也不能在本地测试,最好用代理的IP,具体的我也不太清楚,明天有时间也研究一下。希望楼主能尽快解决问题。
------解决方案--------------------------------------------------------
我刚刚修改了tomcat的server.xml文件中的<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
redirectPort="8443" /> ;
可是为什么tomcat启动的时候提示:警告: No rules found matching "Server/Service/connector".;
还有就是修改成上面的配置后,为什么无法访问了呢,是不是还有其他配置呀?
------解决方案--------------------------------------------------------
可参考:
问个关于jsp 405异常的有关问题 http://www.myexception.cn/java-web/31959.html

 
 转载
转载 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号