Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

长轮询与HTTP的keep-alive

  HTTP/1.1中默认使用keep-alive,只要服务器不断开连接,客户端就会在后续的操作中使用同一个TCP连接来发送请求。这么一来,长轮询的实际情况就发生了变化,它变成了基于一个TCP长连接,不需要反复建立和断开连接,只要在HTTP层的逻辑上完成请求和应答即可。
  比如Apache+PHP,我们可以在httpd.conf中配置KeepAlive相关的参数 KeepAliveTimeout 5
MaxKeepAliveRequests 1000
  KeepAliveTimeout指的是连接空闲多少秒后关闭。长轮询实际上总是在使用连接,不会让连接空闲太久,所以这个超时设置对长轮询来说意义不大。MaxKeepAliveRequests指的是每个连接最多可以执行多少次HTTP请求。这个值可以设置大点,我们甚至希望无论多少次HTTP请求长轮询都永远使用同一个连接。
  下面就是一个简单的测试程序 <?
//test.php
set_time_limit(0);
sleep(1);
echo rand();
?>
<script>
function polling(url){
  //创建IE兼容的XHR对象
  var xhr=window.XMLHttpRequest
    ?new XMLHttpRequest
    :new ActiveXObject("Microsoft.XMLHTTP");
  xhr.onreadystatechange=function(){
    if(xhr.readyState!=4)return;
    //把接收到的文字输出
    var div=document.createElement("div");
    div.appendChild(
      document.createTextNode(xhr.responseText)
    );
    document.body.appendChild(div);
    polling(url); //间接递归
  };
  xhr.open("GET",url,true);
  xhr.send();
};
polling("test.php");
</script>

  程序运行后每秒都可以收到一个服务器推送过来的随机数。这个间隔的时间是php程序中的sleep决定的。这里只是个测试的例子,服务器程序当然可以也可做更复杂的业务逻辑。在Chrome的Network面板中我们可以看到很多HTTP请求,但实际上这些请求都共用一个TCP连接
  这么一来,长轮询就变得基于长连接了,解决了反复对连接的建立和断开的问题。
网名:
54.144.24.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^