使用Ajax来实现Streaming模式的Comet
Firefox和Safari浏览器中,XMLHTTPRequest支持interactive readyState的状态
其对应的readyState状态为3,当Client接收到Server端的一部分数据后就可以触发该状态
当Request请求完成后同样还会触发Success的状态
于是,可以利用这个特性来实现Streaming模式的Comet
Client端测试代码如下:
折叠复制代码
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
- <htmlxmlns="http://www.w3.org/1999/xhtml">
- <head>
- <title>Comet demo</title>
- <metahttp-equiv="Content-Type"content="text/html; charset=utf-8"/>
- <scripttype="text/javascript"src="prototype.js"></script>
- </head>
- <body>
- <divid="abc">The server time will be shown here</div>
- <scripttype="text/javascript">
- var _url="ajax_polling_server.jsp";
- var options= {
- method:'get',
- parameters:'t=0&callback=cb',
- onInteractive:ajaxCallBack,
- onComplete:ajaxCompletCallBack
- };
- var ajax=newAjax.Request(_url, options);
- var byteoffset=0;
- function ajaxCallBack(transport)
- {
- var ret=transport.responseText;
- var data=ret.substring(byteoffset);
- byteoffset=ret.length;
- $('abc').innerHTML=data;
- }
- function ajaxCompletCallBack(transport)
- {
- $('abc').innerHTML=transport.responseText;
- }
- </script>
- </body>
- </html>
Server端代码如下:
折叠复制代码
- <%@ pagelanguage="java"contentType="text/html;charset=UTF-8"
- pageEncoding="UTF-8"%>
- <%@pageimport="java.util.Date"%>
- <%
- response.setHeader("Cache-Control", "no-store");
- response.setHeader("Pragma", "no-cache");
- response.setDateHeader("Expires", 0);
- out.flush();
- %>
- <%
- for(int i=0; i<10; i++){
- out.print(new Date());
- out.flush();
- Thread.sleep(1000);
- }
- %>
注意:
- 该特性目前只适用于Firefox和Safari
- 注意Client代码中的byteoffset,利用这个偏移量来获取每次返回结果中最新的部分