当前位置:  开发笔记 > 编程语言 > 正文

如何实施基本的"长轮询"?

如何解决《如何实施基本的"长轮询"?》经验,为你挑选了12个好方法。

我可以找到很多关于Long Polling如何工作的信息(例如,这个和这个),但没有关于如何在代码中实现它的简单示例.

我所能找到的只是依赖于Dojo JS框架的cometd,以及一个相当复杂的服务器系统.

基本上,我将如何使用Apache来处理请求,以及如何编写一个简单的脚本(例如,在PHP中),它将"长时间轮询"服务器以获取新消息?

该示例不必是可扩展的,安全的或完整的,它只需要工作!



1> dbr..:

这比我最初的想法简单.基本上你有一个什么都不做的页面,直到你想要发送的数据可用(比如,新消息到达).

这是一个非常基本的例子,它在2-10秒后发送一个简单的字符串.三分之一的机会返回错误404(在即将到来的Javascript示例中显示错误处理)

msgsrv.php


注意:对于一个真实的站点,在像Apache这样的常规Web服务器上运行它会快速占用所有"工作线程"并使其无法响应其他请求..有很多方法可以解决这个问题,但建议写一下像Python一样扭曲的"长轮询服务器" ,它不依赖于每个请求的一个线程.cometD是一种流行的(有多种语言版本可供选择),而Tornado是一个专门为这些任务而设计的新框架(它是为FriendFeed的长轮询代码而构建的)......但作为一个简单的例子,A​​pache绰绰有余!这个脚本很容易用任何语言编写(我选择了Apache/PHP,因为它们非常常见,我碰巧在本地运行它们)

然后,在Javascript中,您请求上述文件(msg_srv.php),并等待响应.当你得到一个,你就会对数据采取行动.然后你请求文件并再次等待,对数据采取行动(并重复)

下面是这样一个页面的例子.当页面加载时,它发送msgsrv.php文件的初始请求..如果成功,我们将消息附加到#messagesdiv,然后在1秒后我们再次调用waitForMsg函数,这会触发等待.

1秒setTimeout()是一个非常基本的速率限制器,如果没有这个,它可以正常工作,但如果msgsrv.php 总是立即返回(例如语法错误) - 你淹没浏览器,它可以快速冻结.最好检查文件是否包含有效的JSON响应,和/或保持每分钟/秒的运行总计请求,并适当地暂停.

如果页面错误,它会将错误附加到#messagesdiv,等待15秒然后再次尝试(与每条消息后等待1秒的方式相同)

这种方法的好处是它非常有弹性.如果客户端互联网连接中断,它将超时,然后尝试重新连接 - 这是轮询工作多长时间所固有的,不需要复杂的错误处理

无论如何,long_poller.htm代码,使用jQuery框架:



    BargePoller
    




















    
mobiledu2402851173
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有