facebook如何处理他们的“实时”数据?如果您正在查看自己的活动Feed并且用户喜欢某些内容,您可以立即看到文字更改,说明该用户喜欢它,或者当您收到通知后,您会在页面上看到红色通知标记,而无需刷新。
我知道这段代码无需刷新即可推送数据:
$.post('ajax/test.html', function(data) {
$('.result').html(data);
});
但有人可以解释如何推送实时数据,以便其他用户能够在他们的页面上看到更新而无需刷新。
由于
答案 0 :(得分:6)
这可以使用各种技术来实现,这些技术有很多名称:长轮询,服务器发送事件,Comet,WebSockets等。
基本理念是:
Alice打开脸书。她的浏览器发出更新请求(例如$.get
),但如果没有新的更新且请求仍处于“等待”状态,则服务器不响应。
Bob打开脸书。他决定评论爱丽丝的墙。他的浏览器将他的评论发布到服务器($.post
)。
Alice的浏览器终于得到了对这个长挂请求的响应,并在通知区域中愉快地绘制了一个红色的“1”。它还会立即打开另一个更新请求(不要错过任何一个)。
Alice看到Bob的评论,该评论已立即发布。
所描述的技术称为“长轮询”,谷歌首次在Gmail中引入该技术。
答案 1 :(得分:2)
此问题有多种解决方案,您必须进行一些研究以确定要实施的内容。其中一些解决方案统称为Comet(http://en.wikipedia.org/wiki/Comet_%28programming%29)
Facebook使用的方法是Ajax Long Polling。在此方法中,对服务器进行ajax调用,服务器等待响应,使连接保持挂起状态,直到达到更新或达到最大时间。如果在该间隔期间收到新数据,例如聊天消息,则它立即响应数据。在每次调用结束时,客户端然后启动一个新的ajax调用并等待。如果您在Facebook上观看浏览器控制台,则可以看到这些电话。
下一个方法称为永久帧,其中使用隐藏的iFrame并连续发送chunked日期并且永远不会完成加载。收到后,主框架会读取此数据。
另一种可用的解决方案是WebSockets。 WebSockets是一个真正的双向浏览器持久连接,功能非常强大。然而,它处于早期阶段,直到最近的修订被某些浏览器阻止了安全问题。
答案 2 :(得分:0)