当前位置: 首页 > 知识库问答 >
问题:

服务器使用Ruby Grape发送事件

李浩邈
2023-03-14

我正在尝试在Ruby Grape API上创建服务器发送的事件。问题是,连接似乎总是很快关闭,因为我一直在测试网页上看到连接关闭事件。

客户端连接到服务器,因为我可以看到正在调用的方法,但我想知道为什么连接不是恒定的,为什么我没有收到我使用Thread发送的数据。

以下是我的Ruby代码

$connections = []

class EventsAPI < Sinantra::Base

  def connections
    $connections
  end

  get "/" do
    content_type "text/event-stream"
    stream(:keep_open) { |out|
      puts "New connection"
      out << "data: {}\n\n"
      connections << out
    }
  end

  post "/" do
    data = "data\n\n"
    connections.each { |out| out << data }
    puts "sent\n"
  end

end

以下是我的Javascript:

  var source = new EventSource('http://localhost:9292/events');

  source.onmessage = function(e) {
      console.log("New message: ", e.data);
      showMessage(e.data);
  };

  source.onopen = function(e) {
      // Connection was opened.
  };

  source.onerror = function(e) {
      console.log("Source Error", e)
      if (e.eventPhase == EventSource.CLOSED) {
          console.log("Connection was closed");
          // Connection was closed.
      }
  };

  var showMessage = function(msg) {
      var out = document.getElementById('stream');
      var d = document.createElement('div')
      var b = document.createElement('strong')
      var now = new Date;
      b.innerHTML = msg;
      d.innerHTML = now.getHours() + ":" + now.getMinutes() + ":" +now.getSeconds() + "  ";
      d.appendChild(b);
      out.appendChild(d);
  };

编辑:我使用GET方法实现了它(我将Grape::API更改为Sinatra::Base,因为Grape没有实现流)。我现在接收数据,但连接没有保持活动状态,当我使用post方法时,数据永远不会到达浏览器。

提前感谢您的回答。

共有1个答案

元嘉木
2023-03-14

JS代码看起来是正确的。我的猜测是,您不应该为无限循环启动新线程。将要发生的是,主线程将继续执行,到达其块的末尾,并关闭http请求。然后,将分离的线程留在不存在的输出流中写入。

根据您的编辑进行更新:SSE不支持POST。数据只能通过使用GET Data或cookie传递给SSE进程。

 类似资料:
  • 概述 客户端代码 概述 建立连接 open事件 message事件 error事件 自定义事件 close方法 数据格式 概述 data:数据栏 id:数据标识符 event栏:自定义信息类型 retry:最大间隔时间 服务器代码 参考链接 概述 传统的网页都是浏览器向服务器“查询”数据,但是很多场合,最有效的方式是服务器向浏览器“发送”数据。比如,每当收到新的电子邮件,服务器就向浏览器发送一个“

  • 概述 客户端代码 概述 建立连接 open事件 message事件 error事件 自定义事件 close方法 数据格式 概述 data:数据栏 id:数据标识符 event栏:自定义信息类型 retry:最大间隔时间 服务器代码 参考链接 概述 传统的网页都是浏览器向服务器“查询”数据,但是很多场合,最有效的方式是服务器向浏览器“发送”数据。比如,每当收到新的电子邮件,服务器就向浏览器发送一个“

  • 我试图让服务器发送的事件与Mozilla Firefox一起工作。给定一个Spring Boot的网络服务 使用Chrome浏览器或Edge(始终是最新版本)可以正常工作。我可以在网络分析器选项卡中看到未完成的请求,并且每秒都会显示一个新的时间戳。 然而,当我使用Firefox(84.0.2或更早版本)时,请求也会显示在网络选项卡中,但不会显示响应头或流数据。当我终止Spring后端时,Firef

  • 并在config/bootstrap.php中添加了以下行: 在config/events.php中 在lib/event/mylistener.php中 PS:我使用Cakephp事件是因为它允许我在一个地方从不同的控制器收集所需的数据,然后从那里,我可以创建事件流(服务器发送的事件)。如果有更好的选择,请分享。

  • 问题内容: 我正在尝试使用SSE将JSON数据发送到浏览器,但似乎无法正确处理,而且我也不知道为什么。 服务器端看起来像这样: 如您所见,我已经注释掉了帖子内容,但最终我希望将testdata用作JSON本身,如下所示: 客户端看起来像这样: 我看到控制台日志,但 没有看到警报。 问题答案: 尝试发送适当的JSON(输出中未引用): 但最好:

  • 我使用nghttp2实现了一个REST服务器,它应该使用HTTP/2和服务器发送的事件(由浏览器中的EventSource使用)。然而,基于这些例子,我不清楚如何实现SSE。像在< code>asio-sv.cc中那样使用res.push()似乎不是正确的方法。 做这件事的正确方法是什么?我更喜欢使用nghttp2的C API,但是C API也可以。