我可以找到很多关于Long Polling如何工作的信息(例如,这个和这个),但没有关于如何在代码中实现它的简单示例.
我所能找到的只是依赖于Dojo JS框架的cometd,以及一个相当复杂的服务器系统.
基本上,我将如何使用Apache来处理请求,以及如何编写一个简单的脚本(例如,在PHP中),它将"长时间轮询"服务器以获取新消息?
该示例不必是可扩展的,安全的或完整的,它只需要工作!
这比我最初的想法简单.基本上你有一个什么都不做的页面,直到你想要发送的数据可用(比如,新消息到达).
这是一个非常基本的例子,它在2-10秒后发送一个简单的字符串.三分之一的机会返回错误404(在即将到来的Javascript示例中显示错误处理)
msgsrv.php
注意:对于一个真实的站点,在像Apache这样的常规Web服务器上运行它会快速占用所有"工作线程"并使其无法响应其他请求..有很多方法可以解决这个问题,但建议写一下像Python一样扭曲的"长轮询服务器" ,它不依赖于每个请求的一个线程.cometD是一种流行的(有多种语言版本可供选择),而Tornado是一个专门为这些任务而设计的新框架(它是为FriendFeed的长轮询代码而构建的)......但作为一个简单的例子,Apache绰绰有余!这个脚本很容易用任何语言编写(我选择了Apache/PHP,因为它们非常常见,我碰巧在本地运行它们)
然后,在Javascript中,您请求上述文件(msg_srv.php
),并等待响应.当你得到一个,你就会对数据采取行动.然后你请求文件并再次等待,对数据采取行动(并重复)
下面是这样一个页面的例子.当页面加载时,它发送msgsrv.php
文件的初始请求..如果成功,我们将消息附加到#messages
div,然后在1秒后我们再次调用waitForMsg函数,这会触发等待.
1秒setTimeout()
是一个非常基本的速率限制器,如果没有这个,它可以正常工作,但如果msgsrv.php
总是立即返回(例如语法错误) - 你淹没浏览器,它可以快速冻结.最好检查文件是否包含有效的JSON响应,和/或保持每分钟/秒的运行总计请求,并适当地暂停.
如果页面错误,它会将错误附加到#messages
div,等待15秒然后再次尝试(与每条消息后等待1秒的方式相同)
这种方法的好处是它非常有弹性.如果客户端互联网连接中断,它将超时,然后尝试重新连接 - 这是轮询工作多长时间所固有的,不需要复杂的错误处理
无论如何,long_poller.htm
代码,使用jQuery框架:
BargePoller
Tags | 热门标签
RankList | 热门文章
-
1字符串连接的变体?
-
2改变facebook redirect_uri web api
-
3将Blob数据转换为JavaScript或节点中的Raw缓冲区
-
4如何"手动"表示[NSThread callStackSymbols](获取atos的起始地址)(iOS)
-
5S.browser_fallback_url是什么时候在Chrome中引入的?
-
6如何将Java流转换为滑动窗口?
-
7返回其元素(列)都与引用向量匹配的行的索引
-
8如何在R markdown投影仪中打印较长的书目(超过一页)?
-
9比较矢量值:1个元素与所有其他元素
-
10ggmap扩展缩放或边界
-
11Eclipse Mars:无法解析导入org.osgi
-
12ES6类方法在内部引用类实例的最有效方法
-
13HTML,身高100%不起作用
-
14如何在获取"无法解决放置符号"错误时向Hashmap添加键和值
-
15tvos:UITextView焦点外观像电影App
-
16QML:即使drag属性处于活动状态,也不会调用onDragStarted / finish
-
17使用enable_if进行C++模板重载:使用g ++和clang进行不同的行为
-
18C++ atoi返回错误的值
-
19无法将数据推送到Firebase onclick
-
20如何在Symfony2中使用Beip与Liip\FunctionalTestBundle?