问题标签 [server-sent-events]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
php - 如何在 HTML5 中触发服务器发送事件...或者:PHP 脚本能否知道是否调用了另一个脚本?
现在我喜欢的所有浏览器都几乎完全支持服务器发送事件,我想尝试在一个我一直推迟的网站上实现它,因为我讨厌轮询。但我有最初的犹豫,我希望我能得到一些帮助。
这是我的用例:
用户进入一个基于时间和竞争的表格,在这种情况下是班级注册。在所有条件相同的情况下,他们有一个大约 30 - 40 个他们有资格参加的课程的列表,并且为了最大限度地减少“她先登录但他先点击保存但他不是故意点击保存但她已经选择了”的实例另一个类”等,我想实时制作表单,这样当有人选择一个选项时,它会直接进入数据库,其他任何查看表单的人都会看到它正在填满。(稍后我会处理人们改变主意的压力)。
因此,在轮询场景中,我不得不处理 AJAX 调用,必须检查 40 个点的状态并更新它们,并设置一个可能仍会产生冲突的间隔。
但是使用服务器发送事件,我可以让侦听器只获取需要更新的点,这似乎更好,但这是我卡住的地方:
听众是否有过载的风险?假设脚本连续发送 15 条关于状态更改的消息。我看到有关用户代理应如何处理排队任务的模糊提及,但不清楚这是用于建立连接还是处理服务器发送的消息
这基本上只是将轮询的负担从浏览器传递到服务器吗?脚本是否必须每秒检查一次数据库的更改?有什么方法可以让脚本在发生更改时知道或通知?让我们假设座位请求是
requests.php
通过 ajax发送的,updates.php
并将事件推送回浏览器。有没有一种标准和/或聪明的方法可以让你在提交updates
之前闲置?requests
我能想到的唯一解决方案是requests.php
将提交的更改写入一个平面文件(commits.xml
也许),并且updates.php
每半秒轮询一次文件大小,从而将工作量保持在最低限度。
那里有更好/更智能/更明显的解决方案吗?
php - 如何在 PHP 中实现具有全局范围和持久性的观察者模式
我的目标的基本思想是:
- 用户 A 通过表单提交一个值到
submit.php
- 用户 B 监控提交的值,这些值通过 Server-Sent Event 更新,从 推送
updates.php
。
submit.php
处理将新值写入数据库,以及通知updates.php
.
混淆点:
每个实例(会话)是否
updates.php
需要自己的观察者,因为每个查看更新的用户都将运行他们自己的脚本实例,或者他们都可以共享同一个全局观察者对象吗?当主题对象加载时,它将从哪里获取观察者对象?我不能存储/让观察者睡觉,因为他们很活跃,对吧?
如果我使用 ObjectStorage 对象,当
submit.php
被调用并获取它时,它们是否是观察者对象实际上是观察者对象,我的意思是调用他们的更新方法实际上会更新用户的列表?submit.php
每次提交表单时如何存储/检索 ObjectStorage 对象?显然我不能使用会话,对吧?因为那些将是每个用户?
简短版本:有没有办法在观察者是活动对象的主体端获取包含观察者的全局持久对象?
如果有更好或更简单的方法来实现这个想法(或者如果我完全困惑并需要教育),请告诉我。但我并不是在寻找一个已经可以做到这一切的框架,因为我正在尝试使用这个项目来更好地理解观察者模式作为一个想法。
javascript - 所有事件的 HTML5 EventSource 侦听器?
我使用 EventSource 在我的 JavaScript 客户端应用程序中有推送通知。我可以像这样附加事件侦听器:
但是我想监视从服务器推送的所有事件(基本上是为了调试),所以如果发送了一些事件但它没有事件监听器,我可以很容易地找到它。我的意思是,我不想只是“忽略”所有没有绑定 eventListeners 的事件。
我希望做这样的事情:
但是html5rocks上的规范和教程没有说明这是否可能。
另一方面,它可能是一些允许监视所有服务器事件或其他东西的 firefox/chrome 扩展。这些东西真的有助于开发推送通知。
谢谢!
node.js - 使用 iisnode 运行节点快速服务器 - EventSource 处理程序未触发
我在使用 iisnode 让 node-express 应用程序运行时遇到了一些困难。我在 iis 中有一个简单的 http pub/sub 服务器设置。这通过 POST 接收消息,并将数据推送到相关的侦听客户端。代码...
服务器
客户
...传递给 EventSource url 的参数是唯一标识此客户端的东西。
服务器和客户端托管在同一根域下的不同子域上。我已确认服务器正在正确接收消息。我遇到的问题是客户端事件处理程序永远不会被击中。我尝试将客户端代码包装在 a 中,$(document).ready()
但这没有影响。我已经使用独立的节点进程在 IIS 之外复制了设置,并且可以正常工作。
我在 Windows 7 64 位上使用 Chrome 18、nodejs 0.6.18、iisnode、IIS 7.5。
我的想法很新鲜,并且无法找到在线讨论的任何类似问题。任何帮助,将不胜感激。
api - Digg 的流媒体 API 是如何工作的?
我真的很喜欢这个:http ://services.digg.com/2.0/stream
使用单个连接连续接收数据,内容类型为 application/json。此外,它可以由浏览器使用。这是如何实施的?环顾四周,它似乎不是长轮询、HTML5 服务器发送的事件,甚至不是 websockets。
我将如何构建这样的东西?是否有任何开源解决方案可以用作起点?
谢谢,
/大卫
html - SSE 和 Servlet 3.0
我在页面加载时注册了一个典型的 SSE:
客户:
我的 Javascript-Debugger 说,“事件源打开了!” 成功了。
我的服务器代码是 Servlet 3.0:
代码有效!客户端代码每 3 秒触发一次 doGet() 方法并检索新数据。
问题: 但是,我想知道如何通过使用新的 Servlet 3.0 期货(例如 Async-Support 或 asyncContext.addListener(asyncListener) 或其他我不知道的东西)来使这段代码更好。由于我从不关闭流,我想知道我的服务器将如何扩展?
从理论上讲,最好的方法是在有新数据时通过服务器端代码显式触发 doGet() 方法,因此客户端不需要触发客户端“onmessage()”方法,因此服务器端“doGet()”-每 3 秒获取一次新数据的方法。
asp.net - 警报会话结束,服务器发送事件
我想在 ASP.NET 会话结束时向客户端发送一条消息。我不想使用计时器,所以我尝试使用“服务器发送事件”从 global.asax 中的 session_end 事件调用客户端。有没有办法从 global.asax 调用特定客户端?我尝试为此提议使用“SignalR”库,但在从 Global.asax 调用特定客户端时遇到问题(我已设法调用一组客户端但不是特定客户端)此提议的最佳实践是什么?
python - Twisted 服务器发送事件使用 Internet Explorer 访问
我正在做一个需要实时更新的项目。所以,很久以前,我决定使用 Twisted SSE Handler (cyclone.sse)。该项目已结束。除了 Internet Explorer 之外,所有 pub/sub 的内容都适用于所有浏览器。IE 不支持 SSE。如何在不更改服务器端代码的情况下让 pub-sub 在 IE 上工作?当我使用 cyclone.sse 时,长轮询也无济于事。
javascript - HTML5 → 动态关联的服务器发送事件
我刚开始使用 SSE,想知道如何让它们变得更有活力。
我正在使用 Box 来选择用户以及与用户名相对应的图像和文本更改。现在我想通过 SSE 检查用户更新,并希望用户仍然可以选择。
我在更改框时尝试添加eventSource<select>
:
我怎样才能达到我的目标?
编辑 我现在已经成功添加了 eventSource(我的源本身有问题)。
但是当我现在添加另一个源时,我实际上有两个源在运行。我怎样才能删除旧的?
php - PHP 服务器发送事件减少流量
我刚开始在我的 PHP 页面中使用 SSE。我可以很容易地用这段代码发送新数据:
但这意味着,我每秒都在向客户端发送数据,并且我必须运行一个循环。示例中的字符串没有太多数据。但后来我想连接到数据库并从那里提取东西。
如果我要提取整篇文章(或消息或其他任何东西)之类的东西,我会产生大量数据。
现在我的问题是:如何告诉脚本提供新数据并将其从另一个 PHP 脚本发送到客户端?
我创建了一个小的 iOS 应用程序,它使用一个小的 API 将状态更新发送到服务器。我想要一个 API 脚本来告诉 Web 界面事件源脚本发送新数据。
只有当我告诉它这样做时。我怎样才能做到这一点?
感谢您的帮助,致以亲切的问候,朱利安