Firefox和Safari浏览器中,XMLHTTPRequest支持interactive readyState的状态


其对应的readyState状态为3,当Client接收到Server端的一部分数据后就可以触发该状态


当Request请求完成后同样还会触发Success的状态


于是,可以利用这个特性来实现Streaming模式的Comet


Client端测试代码如下:



折叠复制代码




  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

  2. <htmlxmlns="http://www.w3.org/1999/xhtml">

  3. <head>

  4. <title>Comet demo</title>

  5. <metahttp-equiv="Content-Type"content="text/html; charset=utf-8"/>

  6. <scripttype="text/javascript"src="prototype.js"></script>

  7. </head>

  8. <body>

  9. <divid="abc">The server time will be shown here</div>

  10. <scripttype="text/javascript">

  11. var _url="ajax_polling_server.jsp";

  12. var options= {

  13. method:'get',

  14. parameters:'t=0&callback=cb',

  15. onInteractive:ajaxCallBack,

  16. onComplete:ajaxCompletCallBack

  17. };

  18. var ajax=newAjax.Request(_url, options);

  19. var byteoffset=0;

  20. function ajaxCallBack(transport)

  21. {

  22. var ret=transport.responseText;

  23. var data=ret.substring(byteoffset);

  24. byteoffset=ret.length;

  25. $('abc').innerHTML=data;

  26. }

  27. function ajaxCompletCallBack(transport)

  28. {

  29. $('abc').innerHTML=transport.responseText;

  30. }

  31. </script>

  32. </body>

  33. </html>




Server端代码如下:



折叠复制代码




  1. <%@ pagelanguage="java"contentType="text/html;charset=UTF-8"

  2. pageEncoding="UTF-8"%>

  3. <%@pageimport="java.util.Date"%>

  4. <%

  5. response.setHeader("Cache-Control", "no-store");

  6. response.setHeader("Pragma", "no-cache");

  7. response.setDateHeader("Expires", 0);

  8. out.flush();

  9. %>

  10. <%


  11. for(int i=0; i<10; i++){

  12. out.print(new Date());

  13. out.flush();

  14. Thread.sleep(1000);

  15. }

  16. %>





注意:



  1. 该特性目前只适用于Firefox和Safari

  2. 注意Client代码中的byteoffset,利用这个偏移量来获取每次返回结果中最新的部分