- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我读过一些关于这个主题的帖子,答案是 comet、反向 ajax、http 流、服务器推送等。
How does incoming mail notification on Gmail works?
How is GMail Chat able to make AJAX requests without client interaction?
我想知道是否有任何代码引用可以让我编写一个非常简单的示例。许多帖子或网站只是谈论该技术。很难找到完整的示例代码。另外,似乎可以使用很多方法来实现 cometd ,例如隐藏的 IFrame、XMLHttpRequest。在我看来,使用 XMLHttpRequest 是更好的选择。您认为不同方法的优缺点如何? Gmail 使用哪一种?
我知道它需要在服务器端和客户端都执行此操作。有 PHP 和 Javascript 示例代码吗?
最佳答案
Facebook 的做法非常有趣。
执行此类通知的常见方法是在给定的时间间隔(可能每隔几秒)轮询服务器上的脚本(使用 AJAX),以检查是否发生了某些情况。但是,这可能会占用大量网络资源,并且您经常会发出毫无意义的请求,因为什么也没有发生。
Facebook 的做法是使用 cometd 方法,而不是按一定时间间隔进行轮询,一旦一个轮询完成,它就会发布另一个轮询。但是,对服务器上脚本的每个请求都有极长的超时时间,并且服务器只有在发生某些情况时才会响应请求。如果您在 Facebook 上打开 Firebug 的“控制台”选项卡,您就会看到这种情况的发生,其中对脚本的请求可能需要几分钟的时间。这确实非常巧妙,因为这种方法立即减少了请求的数量以及发送请求的频率。您现在实际上拥有了一个允许服务器“触发”事件的事件框架。
在这背后,就这些民意调查返回的实际内容而言,它是一个 JSON 响应,其中似乎是事件列表以及有关事件的信息。虽然它被缩小了,所以有点难以阅读。
就实际技术而言,AJAX 是最佳选择,因为您可以控制请求超时以及许多其他事情。我建议(这里是堆栈溢出陈词滥调)使用 jQuery 来执行 AJAX,它将消除很多交叉兼容性问题。就 PHP 而言,您可以简单地在 PHP 脚本中轮询事件日志数据库表,并且仅在发生某些情况时才返回客户端?我预计有很多方法可以实现这一点。
实现:
服务器端:
PHP 中似乎有一些 Comet 库的实现,但说实话,它确实非常简单,可能类似于以下伪代码:
while(!has_event_happened()) {
sleep(5);
}
echo json_encode(get_events());
has_event_happened 函数只会检查事件表中是否发生了任何事情,然后 get_events 函数将返回表中新行的列表?具体取决于问题的背景。
不要忘记更改 PHP 最大执行时间,否则它会提前超时!
客户端:
看一下用于进行 Comet 交互的 jQuery 插件:
也就是说,该插件似乎增加了相当多的复杂性,它在客户端上确实非常简单,也许(使用 jQuery)类似于:
function doPoll() {
$.get("events.php", {}, function(result) {
$.each(result.events, function(event) { //iterate over the events
//do something with your event
});
doPoll();
//this effectively causes the poll to run again as
//soon as the response comes back
}, 'json');
}
$(document).ready(function() {
$.ajaxSetup({
timeout: 1000*60//set a global AJAX timeout of a minute
});
doPoll(); // do the first poll
});
整个事情在很大程度上取决于您现有架构的组合方式。
关于comet - facebook、gmail如何发送实时通知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1086380/
我想测试它可以支持多少个连接。 我正在使用轨道,特别是流媒体,而不是长轮询。 最佳答案 Webload是你正在寻找的东西。 关于comet - 如何对 Comet 服务器进行压力测试?,我们在Stac
我看到 Akka 模块的描述说 Play有很好的 Comet 支持,但我从未使用过 Comet之前,我在 Play 的文档中找不到任何提及。它在 Play 中是如何工作的? 我花了两天多的时间来解决这
我尝试设置 comet ( https://www.comet.ml ) 来跟踪我的 Tensorflow 实验,在创建实验并记录数据集后,我在报告中无法获得准确性。 我的代码: mnist = ge
我正在尝试设置 https://www.comet.ml记录我的实验细节 出现奇怪的错误: Traceback (most recent call last): File "train.py",
我正在运行来自 Comet github project 的 keras 示例. 我添加导入并创建一个新实验: def train(x_train,y_train,x_test,y_test): mo
在 Comet/Reverse Ajax/PubSub 底层技术/基础是 Long polling。所以连接保持打开一分钟左右.. 根据我对网络和操作系统的了解,TCP/IP 仅支持 65535 个端
您与 Websync 合作的体验如何? ( cometd 框架)?在使用它之前,您是否考虑过任何替代方案? 到目前为止我可以说 优点: 非常简单易用 不需要任何服务器配置 缺点: 昂贵(结果为我们节省
我正在考虑编写一个需要能够将消息推送到浏览器的实时网络应用程序。当我第一次阅读 Comet 时,由于浏览器支持薄弱,人们似乎认为它是一种脆弱且不成熟的方法。今天,它似乎是一种既定又实用的技术。但据我所
我需要一些 linux 大师的帮助。我正在开发一个包含 cometd 服务器的网络应用程序。 Comet 服务器在 localhost:8080 上运行,并公开 url localhost:8080/
我读过一些关于这个主题的帖子,答案是 comet、反向 ajax、http 流、服务器推送等。 How does incoming mail notification on Gmail works?
我正在使用 JSONP 进行长轮询,firefox 不断弹出“正在加载”微调器,使页面看起来好像还没有完成加载。有没有办法抑制这种情况? 有人告诉我,Orbited 团队有一些技巧可以抑制这种情况,但
我有一个用 Twisted 编写的简单 cometd 服务器。它打印出时间戳。我还有一个小型静态网络服务器在同一端口上运行。所服务页面上的 JavaScript 尝试通过附加来自 Comet 服务器的
我断断续续地学习 Scala 一段时间,并成功地建立并运行了一个简单的实时发布系统。 我想知道是否有人可以帮助我在正确的方向上通过 JSON 将数据更改推送到我正在运行的几个 javascript 模
我正在尝试为 Comet 设计一个实用的客户端 (JavaScript) 实现。 http://en.wikipedia.org/wiki/Comet_(programming) ) 谈论理论,但我很
我听说我可以使用 Comet作为服务器推送技术与我的 Ajax 代码一起提高我的 Web 应用程序的性能。 这项 cometd 技术有多成熟? 是否所有网络服务器、编程语言和浏览器都支持它? 使用 C
对于一个社交网站,我们使用基于 node.js 的 Comet 服务器作为即时通讯工具,一切都运行良好,我们只有一个问题如何解决澳大利亚和新西兰的延迟问题,我们的 RRT 在 310 毫秒到 440
我一辈子都弄不明白像 Cometd 或 simple-comet 这样的应用程序的目的是什么,而不是像使用 php 的简单长轮询请求和使用这样的代码的无限循环 $time = time(); whil
这更多是出于好奇和“供将来引用”,但 Comet 是如何在数据库端实现的?我知道大多数实现使用长生命周期 HTTP 请求来“等待”直到数据可用,但这是如何在服务器端完成的? Web 服务器如何知道新数
我一直想知道使用 COMET/推送技术是否比使用长请求的更简单的轮询有真正的优势,在轮询中服务器将等待特定的最长时间以等待新事件发生,然后再告诉客户端什么都没有发生. 这两种技术都有相似的客户端延迟,
我想编写一个实时聊天应用程序,需要决定使用哪些技术。 这些技术之间有什么区别,您更喜欢哪一种,为什么? WebSockets 不是一种选择,因为它还没有准备好在野外战斗 谢谢 最佳答案 您应该阅读问题
我是一名优秀的程序员,十分优秀!