问题标签 [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.

0 投票
1 回答
1376 浏览

php - EventSource 在第一条消息后断开连接

EventSource行为有点困惑。

它连接良好并保持连接,直到收到第一条消息。

当我发送一条data: something\n\n消息时,连接被断开并创建了一个新连接。

使用Content-Type: text/event-stream标头和连接被识别为事件流,并且检查器显示pending状态。

正如我所说,在我发送第一条消息之前,一切正常。

在此之后,连接被中断并创建了新的连接,并且消息没有发送到浏览器(至少页面没有按应有的方式更新)。

我的服务器和客户端代码与此处完全相同:http: //www.html5rocks.com/en/tutorials/eventsource/basics/

这发生在任何浏览器上。

0 投票
1 回答
202 浏览

html - 从网络解析 HTML5 EventSource 流

我研究了 HTML5 EventSource 规范,但不知道如何在接收到的数据结束时解析和处理回车。

应用程序接收由行组成的数据流。每行可以由 \r\n、\n 或 \r 终止。在空白行上,事件应被视为已准备好并已向侦听器触发。

相同内容的同等有效事件

完整规范在这里,http ://dev.w3.org/html5/eventsource/ 第 6 章描述了输入的 BNF。

问题是在接收数据结束时看到回车。现在,据我所知,正确的解析方法是进行最长匹​​配搜索,然后等待下一批数据。问题是,如果 \r 确实是空行标记,则在下一批数据到达并且解析器有足够的数据尝试最长匹配之前,不会触发该事件。

当前数据批次

下一批数据

替代案例。下一批数据

这在传统解析中不会有问题,但它在 EventSource 中,因为我需要尽快触发事件,所以如果实现等待下一个数据批次获得最长匹配,如果发送方使用单个字符可能会等待很长时间\r' 作为空行标记,暂时不会发送任何其他内容。

0 投票
1 回答
3514 浏览

php - 服务器发送事件停止以新参数开始

请帮忙。

我正在使用服务器发送事件根据存储在数据库中的数据动态更新网站。

我现在希望根据上一条消息中收到的数据将一个新参数 ('abc.php/?lastID=xxx') 传递回 PHP 脚本。

我知道我可以event.close用来停止当前的“流”,但我正在努力弄清楚如何对'EventListener'动态创建 URL 的每个新 EventSource 使用相同的

有人可以指出我正确的方向吗?

谢谢,

0 投票
1 回答
849 浏览

ruby - CORS SSE - 未捕获的错误:SECURITY_ERR:DOM 异常 18

我正在开发一个流媒体服务器,它使用Goliath和 SSE 实时发送最新推文、新闻 ets 等更新。该服务器将映射到不同的域。

索引.html

歌利亚组件

Goliath 流媒体服务器在本地机器的 9000 端口上运行。当我尝试通过http://localhost/index.html它访问页面时,即使它发送 CORS 'Access-Control-Allow-Origin' 标头作为响应,也会给出 Chrome 中提到的错误。请不要在这里它在FF上工作正常。

知道如何解决这个问题吗?

0 投票
1 回答
132 浏览

javascript - javascript - 每次都为变量引用 DOM

问题的标题似乎具有误导性,因为我知道如果您想每次都引用 DOM,则不应使用变量。但是,情况有点不同。我创建了一个 SSE 脚本,它在第一次加载页面时可以完美运行,但由于页面内容不断变化,它并不总是有效。

如您所见,第一个变量将数据放入数组中以放入EventSourceurl。显然,这不会像页面那样继续更新,也不会source。我试着把所有东西都串起来,而不是source.onmessage...变成;

但这不起作用,因为事件源没有改变。我希望每次请求 SSE 源时都引用 DOM。我知道这不是做这些事情的好方法,但在这种情况下我看不到解决方法。

0 投票
2 回答
8256 浏览

python - pyserial 读取烧瓶中的串口(可能使用 gevent)

我正在构建一个需要读取(并继续读取)它正在运行的机器的串行端口的网络服务器。
目的是能够读取条形码扫描仪,并使用服务器发送的事件来使用读取的条形码更新浏览器。

我正在使用烧瓶来做到这一点。我浏览了一下,有些实现只需要烧瓶,有些人说我需要一个像 Gevent 这样的异步库,还有一些人甚至说我需要 Gevent 和某种队列,比如 Redis 或 RabbitMQ。

我试图将我的代码基于我在 stackoverflow 上找到的一个非常简单的示例。我大部分时间都在工作,但我遇到了一些问题;

  • 在 Chrome 中存在跨域错误,通过添加 Access-Control-Allow-Origin 标头,我可以让它在 FireFox 中工作,但 Chrome 仍然无法工作。只有FF支持SSE跨域对吗?我需要它来支持 CORS,因为浏览器需要从单独的机器加载条形码数据。
  • 每条消息后,浏览器都会在控制台中显示条形码,但随后会关闭连接,大约 3 秒后才再次打开。这似乎起源于 Flask,它给了我数据然后就停止了。
  • 另外,我想知道这将如何在负载下执行。我的意思是,flask 为文本/事件流 mimetype 保持连接打开。如果有多个客户端连接,过一会会不会阻塞flask,因为所有的连接都会饱和?

我的代码如下(为清楚起见缩短了)

服务器端:

客户端:

我在这里查看了更多信息:http: //www.socketubs.net/2012/10/28/Websocket_with_flask_and_gevent/ http://sdiehl.github.com/gevent-tutorial/#chat-server

我希望有人能解决我的问题,并可能为我指出一些解决方案,解决跨域和 3 秒延迟问题。

谢谢。

0 投票
1 回答
1569 浏览

javascript - SSE 未捕获错误:SECURITY_ERR:DOM 异常 18,服务器提供服务器发送事件 (SSE)

我正在尝试将浏览器与提供服务器发送事件 (SSE) 的服务器连接。此服务器具有与原始服务器不同的域。例如,如果您调用http://d1.example.com/page此页面将尝试连接到上的 SSE 频道http://d2.example.com/subscribe。尝试这样做会提示以下错误:

Uncaught Error: SECURITY_ERR: DOM Exception 18

在线上:

var source = new EventSource("http://d2.example.com/subscribe")

我该如何解决?

更新(我尝试过的解决方案):

1-CORS

我通过添加到我的 web 服务的标头来尝试CORS。它没有解决问题,即使来自页面的调用现在工作正常!我认为 SSE 适用于正常的 HTTP 请求,那么为什么它不适用于 Chrome?Access-Control-Allow-Origin:*d2.example.comEventSource$.get("http://d2.example.com")d1.example.com

2-重定向

我正在使用 httpd 服务器,因此我在d1.example.com虚拟主机中创建了一个重定向规则,将 SSE 请求传递到d2.example.com. 它与 Firefox 完美配合。另一方面,Chrome 没有提示任何错误,也没有连接到 SSE 服务器。看起来它转储了整个EventSource命令。看起来这个解决方案永远不会起作用,所以让我们继续......

3-反向代理

连接的两个浏览器d1.example.com/subscribe基本上都是d2.example.com通过反向代理连接的。但是on_close即使浏览器关闭,事件也永远不会被捕获。这是有道理的,因为 d2 服务器现在正在与代理服务器建立通道。如何将on_close事件从代理服务器转发到 d2?

是否有任何不同的方法可以使这项工作?

0 投票
1 回答
1795 浏览

javascript - 实施 SSE/EventSource 的正确方法?

我在网上看到了作者设置的教程,SSE/EventSource并且在服务器 PHP 脚本中回显了一些数据,然后调用ob_flush()并将flush()数据发送回客户端浏览器。这工作正常,新数据每 3 秒被推送到客户端。

但我也读到有人说这是使用 SSE 的错误方法。这个人说,SSE的全部意义在于服务器应该保持连接,而使用上述方法将新数据推送到客户端的原因是因为EventSource实现了服务器断开连接。这个人说服务器应该使用循环并通过使用睡眠每隔几秒钟将数据推送出去。

那么,是这样的吗?SSE 是否应该通过在服务器上设置一个循环并推送数据来实现,sleep()用于调整推送的速度?

0 投票
0 回答
177 浏览

ruby - 象棋类游戏的红宝石设置

我要开始一个宠物项目,把这个棋盘游戏带入网络。为简单起见,想象一下 pvp 国际象棋。

我对这种异步编程的经验很少。唯一的一个 - 我使用 sinatra 的流媒体功能写了一个简单的聊天。

我有两个密切相关的问题:

  • 我应该如何组织游戏流程?我应该将游戏状态存储在数据库中吗?或者我可以有一个类,例如游戏,并将所有内容存储在其中吗?第二个选项听起来更容易,更自然,但是是否可以在具有客户端-服务器异步性质的应用程序中实现它?

  • 客户端应该如何与服务器交互?我希望实时更新董事会状态。js EventSource 是这里的最佳选择吗?除了带有 stream 关​​键字的 Sinatra 应用程序之外,我还需要什么吗?我需要 EventMachine 吗?

0 投票
1 回答
3777 浏览

php - 如何在 PHP 中实现服务器发送事件?

我已经使用 php 和一个 while 循环设置了一个服务器发送事件脚本,我不希望脚本必须继续关闭并且必须重新轮询,所以我把它全部放在一个 while 循环中。

问题是脚本被卡住了,我不得不放弃那条路线,而是使用了 node.js websocket 后端。

我的问题是,如果我回去制作服务器发送事件 php 脚本,我该如何实现它?
while循环似乎并没有削减它,因为它挂起脚本,如果它只是每秒连接和断开连接,它与长轮询没有什么不同,所以我如何创建一个不会挂起的 PHP 脚本,同时还发送上证所消息?