服务器推送技术comet(AJAX长轮询)
2014-11-14 09:25
357 查看
服务器推送技术
推送技术的基础思想是将浏览器主动查询信息改为服务器主动发送信息。服务器发送一批数据,浏览器显示这些数据,同时保证与服务器的连接。当服务器需要再次发送一批数据时,浏览器显示数据并保持连接。以后,服务器仍然可以发送批量数据,浏览器继续显示数据,依次类推。
第一步 : jar包准备
catalina.jar去网上下载即可
将jar包放入tomcat的lib中,修改server.xml中的<Connector protocol="org.apache.coyote.http11.Http11NioProtocol" port="8088" redirectport="8443" connectiontimeout="20000" />主要是修改了协议,因为长轮询使用的不是HTTP/1.1协议。
第二步 新建项目
在javaweb项目中也需要添加catalina.jar,不然会报找不到jar包
代码如下:产生随机数字
前端访问页面:
推送技术的基础思想是将浏览器主动查询信息改为服务器主动发送信息。服务器发送一批数据,浏览器显示这些数据,同时保证与服务器的连接。当服务器需要再次发送一批数据时,浏览器显示数据并保持连接。以后,服务器仍然可以发送批量数据,浏览器继续显示数据,依次类推。
第一步 : jar包准备
catalina.jar去网上下载即可
将jar包放入tomcat的lib中,修改server.xml中的<Connector protocol="org.apache.coyote.http11.Http11NioProtocol" port="8088" redirectport="8443" connectiontimeout="20000" />主要是修改了协议,因为长轮询使用的不是HTTP/1.1协议。
第二步 新建项目
在javaweb项目中也需要添加catalina.jar,不然会报找不到jar包
代码如下:产生随机数字
package com.java.comet; import java.io.IOException; import java.io.PrintWriter; import java.util.Random; import java.util.Scanner; import javax.servlet.ServletResponse; public class RandomSender implements Runnable{ protected boolean running=true; private ServletResponse response; Random rand; public RandomSender(ServletResponse response) { this.response = response; rand=new Random(); } public void run() { while(running){ try{ PrintWriter out = response.getWriter(); int val=rand.nextInt(10); if(val>5){ //out.write(rand.nextInt(10)); out.println(val); } else{ out.println("No"); } out.flush(); response.flushBuffer(); try{ Thread.sleep(1000); }catch(InterruptedException e){ } }catch(IOException e){ e.printStackTrace(); } } } }服务端代码:
package com.java.comet; import java.io.IOException; import java.io.PrintWriter; import java.util.Scanner; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.catalina.CometEvent; import org.apache.catalina.CometEvent.EventType; import org.apache.catalina.CometProcessor; public class CometService extends HttpServlet implements CometProcessor { private RandomSender randomSender=null; private static final Integer TIMEOUT=60 * 1000; public void event(CometEvent event) throws IOException, ServletException { System.out.println("访问event()方法"); HttpServletRequest request=event.getHttpServletRequest(); HttpServletResponse response=event.getHttpServletResponse(); if(event.getEventType() == CometEvent.EventType.BEGIN){ request.setAttribute("org.apaphe.tomcat.comet.timeout", TIMEOUT); randomSender = new RandomSender(response); Thread thread = new Thread(randomSender); thread.start(); }else if(event.getEventType() == CometEvent.EventType.ERROR){ event.close(); }else if(event.getEventType() == CometEvent.EventType.END){ event.close(); }else if(event.getEventType() == CometEvent.EventType.READ){ throw new UnsupportedOperationException("服务器端没有接收数据"); } } }
web.xml配置 <servlet> <servlet-name>comet</servlet-name> <servlet-class>com.java.comet.CometService</servlet-class> </servlet> <servlet-mapping> <servlet-name>comet</servlet-name> <url-pattern>/comet</url-pattern> </servlet-mapping>
前端访问页面:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> <script> function CometEx() { var request = new XMLHttpRequest(); request.open("GET", "http://localhost:8088/comet/comet", true); //request.setRequestHeader("Content-Type", "application/x-javascript;"); request.onreadystatechange = function() { if (request.readyState ==3 && request.status == 200) { if(request.responseText){ document.getElementById("content").innerHTML=request.responseText; } //alert(request.responseText); } }; request.send(null); } function test() { var temp = document.getElementsByName("r"); for(var i=0;i<temp.length;i++) { if(temp[i].checked) alert(temp[i].value); } } </script> </head> <body > <input type="button" id="btn" onclick="CometEx()" value="点击"/> <div id="content"> </div> <!-- <div> <input type="radio" name="r" value="a" onclick="test()"/> <input type="radio" name="r" value="b" onclick="test()"/> <input type="radio" name="r" value="c" onclick="test()"/> </div> --> </body> </html>配置文件和代码到此结束。
相关文章推荐
- Comet, 下一代反向AJAX(即服务器推送技术- Server-side push)
- Comet, 下一代反向AJAX(即服务器推送技术- Server-side push)
- Comet, 下一代反向AJAX(即服务器推送技术- Server-side push)
- Comet, 下一代反向AJAX(即服务器推送技术- Server-side push)
- Comet, 下一代反向AJAX(即服务器推送技术- Server-side push)
- Comet, 下一代反向AJAX(即服务器推送技术- Server-side push)
- Comet, 下一代反向AJAX(即服务器推送技术- Server-side push)
- Comet, 下一代反向AJAX(即服务器推送技术- Server-side push)
- Comet4J(Comet for Java)是一个纯粹基于AJAX(XMLHTTPRequest)的服务器推送框架,消息以JSON方式传递,具备长轮询、长连接、自动选择三种工作模式。
- web聊天程序,ajax+服务器推送技术
- (推荐)(转)一种新的 Web 服务器推送技术 - comet
- 基于comet服务器推送技术(web实时聊天)
- Comet:基于 HTTP 长连接的“服务器推”技术(轮询)
- Comet4J(Comet for Java)是一个纯粹基于AJAX(XMLHTTPRequest)的服务器推送框架,消息以JSON方式传递
- 基于comet服务器推送技术(web实时聊天)
- Web-服务器推送push——websocket、ajax轮询
- “服务器推”技术之使用HTTP长轮询的Comet
- Comet服务器推送技术
- Comet 服务器推送技术
- java web 服务器推送技术--comet4j