长连接的问题【求教】
我想实现一个长连接,
客户端用js向服务端发出一个请求,php接到请求后,进行一些处理(用curl到别的地方取一些信息),然后推送到客户端,这时候客户端(JS)接到信息进行处理后,用什么方式可以再将信息利用这个长连接发送到服务器端?
我用类似这种方式实现长连接的,是不是这种长连接只能是客户端第一次向服务端发送请求后,后续只能是服务器向客户端推送内容,客户端还能利用这个连接向服务器发送内容么:
PHP code
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->
header("Content-Type:text/html");
set_time_limit(0);
$num = 3;
while($num){
$num--;
print str_repeat(" ", 4096);
echo date("H:i:s")."<br>";
ob_flush();
flush();
sleep(2);
}
ob_end_flush();
登录后复制
------解决方案--------------------
所谓“长连接”是等待数据返回时间很长的连接
服务端也没有“推送到客户端”,只是在收到请求后经过一个相当长的时间间隔后才“返回”数据到客户端
在模拟“长连接”的实现中
客户端的 ajax 在收到返回数据后,立即发起新的一轮连接
服务器端的 php 也不是像你那样一直处于死循环中,而是一旦输出完成就跳出循环而结束程序的运行
------解决方案--------------------传送到客户端程序后再激活一个js函数,通过ajax,把数据再传回php的一个方法里,那时那个连接肯定不在了,不能持续的,放在缓存里应该也不行
------解决方案--------------------请使用AJAX定时器轮询,这个世界没有HTTP长连接。
------解决方案--------------------
在使用 ajax 时,我们都是用 readyState == 4 来判断数据是否加载完成(status == 200 只是表示没有错误)
按照你的期望,你可以在 readyState == 3 (表示有数据到达)时就开始去数据
只不过这个信号只是在 Firefox 中才是可靠的
Firefox 是在 netscape 公司倒闭时公布的 netscape 浏览器源码的基础上发展的
而 netscape 浏览器本身就是支持 server push 的,只是当时占主流的 IE 不支持,所以这个技术发展不起来
估计当大多浏览器厂商把 bt、p2p 技术引入浏览器时,服务器推才有可能真正的发展起来