灌木大叔

每一个不曾起舞的日子都是对以往生命的辜负!!

  :: 首页 :: 博问 :: 闪存 :: :: 联系 :: 订阅 订阅 :: 管理 ::

摘自https://blog.csdn.net/dreamoftch/article/details/12615753?utm_source=jiancool

参考资料:http://tomcat.apache.org/tomcat-6.0-doc/aio.html

 首先引入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支持推送功能了

 (注意:最后关闭连接的时候,要用CometEvent的close()方法)

 然后写servlet,实现comet特定接口,实现event方法:

下面的例子作用是当一个请求没有携带name参数的时候,将该请求的HttpServletResponse存放到list中,等待后面某个请求携带了name参数的时候,通过推送的方式通知所有人该消息,当然,如果时间超时,则返回error,页面再次发生请求即可。个人感觉不错的入门例子。

 1 public class MyCometServlet extends HttpServlet implements CometProcessor {
 2 
 3         List<HttpServletResponse> responses = new ArrayList<HttpServletResponse>();
 4     public void event(CometEvent event) throws IOException, ServletException {
 5         HttpServletRequest request = event.getHttpServletRequest();
 6         HttpServletResponse response = event.getHttpServletResponse();
 7         
 8                 //请求开始
 9         if (event.getEventType() == CometEvent.EventType.BEGIN) {
10             //设置超时时间,单位ms
11             event.setTimeout(3000);
12             responses.add(response);
13             // 昵称
14             String name = request.getParameter("name");
15             System.out.println(name);
16             if (name == null) {
17                 return;
18             }
19             
20             Writer writer = null;
21             for(HttpServletResponse r:responses){
22                 r.setCharacterEncoding("utf-8");
23                 writer = r.getWriter();
24                 writer.write("欢迎:"+name);
25                 System.out.println("-----");
26                 writer.flush();
27                 event.close();
28             }
29         } else if (event.getEventType() == CometEvent.EventType.ERROR) {
30                        //请求超时
31             response.setCharacterEncoding("utf-8");
32             response.getWriter().write("error");
33             response.getWriter().flush();
34             response.getWriter().close();
35                         event.close();
36         } else if (event.getEventType() == CometEvent.EventType.END) {
37                         //请求结束
38             response.setCharacterEncoding("utf-8");
39             response.getWriter().write("end");
40             response.getWriter().flush();
41             response.getWriter().close();
42                         event.close();
43         } else if (event.getEventType() == CometEvent.EventType.READ) {
44                         //读取请求数据
45             response.setCharacterEncoding("utf-8");
46             response.getWriter().write("read");
47             response.getWriter().flush();
48             response.getWriter().close();
49                         event.close();
50         }
51     }
52 
53 
54 }

当然该servlet要在web.xml中配置,我的映射路径为:/cometServlet

 其中页面可以通过js发送请求,也可以通过直接在地址栏输入url,都可以

例如jquery异步请求:

1 $.post("cometServlet",function(data){
2    alert(data);
3 });
可以携带参数:
  1. var param={"name":"dreamoftch"};  
  2. $.post("cometServlet",param,function(data){  
  3.     alert(data);  
  4. });  

或者直接地址栏输入:

http://localhost:8080/comet_helloWorld/cometServlet?name=dreamoftch

(携带参数的话,直接就有相应,没有参数则会等待)

 比较明显的例子是多个页面发多个请求,前面的几个请求不携带name参数,最后一个携带name参数,就会使前面的所有的请求都接收到响应,当然超时的话会进到error里面。

posted on 2018-04-03 17:49  灌木大叔  阅读(256)  评论(0编辑  收藏  举报