摘自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 });
可以携带参数:
- var param={"name":"dreamoftch"};
- $.post("cometServlet",param,function(data){
- alert(data);
- });
或者直接地址栏输入:
http://localhost:8080/comet_helloWorld/cometServlet?name=dreamoftch
(携带参数的话,直接就有相应,没有参数则会等待)
比较明显的例子是多个页面发多个请求,前面的几个请求不携带name参数,最后一个携带name参数,就会使前面的所有的请求都接收到响应,当然超时的话会进到error里面。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步