日期:2014-05-17  浏览次数:20434 次

长连接的问题【求教】
我想实现一个长连接,
客户端用js向服务端发出一个请求,php接到请求后,进行一些处理(用curl到别的地方取一些信息),然后推送到客户端,这时候客户端(JS)接到信息进行处理后,用什么方式可以再将信息利用这个长连接发送到服务器端?


我用类似这种方式实现长连接的,是不是这种长连接只能是客户端第一次向服务端发送请求后,后续只能是服务器向客户端推送内容,客户端还能利用这个连接向服务器发送内容么:
PHP code

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 技术引入浏览器时,服务器推才有可能真正的发展起来