服务器推送技术comet(AJAX长轮询)

来源:互联网 发布:方正字库 mac 编辑:程序博客网 时间:2024/04/30 11:21

 服务器推送技术

      推送技术的基础思想是将浏览器主动查询信息改为服务器主动发送信息。服务器发送一批数据,浏览器显示这些数据,同时保证与服务器的连接。当服务器需要再次发送一批数据时,浏览器显示数据并保持连接。以后,服务器仍然可以发送批量数据,浏览器继续显示数据,依次类推。

 第一步 : 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>
配置文件和代码到此结束。




0 0
原创粉丝点击