【问题标题】:HTTP Body Streaming with Javascript使用 Javascript 的 HTTP 正文流式传输
【发布时间】:2014-03-06 00:17:50
【问题描述】:

我正在编写一个调试/管理节点服务器,它允许用户在机器上执行一个长时间运行的进程。我想将子进程的输出流式传输到他们开始操作的表单。

我可以使用套接字来做到这一点,但我必须让客户端订阅一个频道,并且当它们只与一个客户端有关时,我必须将消息发布到整个频道。

我希望能够将 http 正文向下传输到客户端。我可以用 node 很容易地做到这一点:只需继续写入请求的套接字,完成后调用 end。

有什么方法可以使用 XhrHttpRequest 来调用 Web 服务,让它在新数据可用时触发事件,并在它关闭时触发最终事件?可以用 jQuery 吗?

请注意,这与正常的实时更新并不完全相同,对于后者来说,套接字是一个不错的选择。这是一个单一的请求。我只想得到碎片的回应。

【问题讨论】:

  • 听起来像long polling
  • 我知道这听起来很像,但我不想投票。我想保留对单个请求套接字的引用并继续向其发送数据。长轮询需要一些其他方式来保存数据(不仅仅是请求的范围)
  • 虽然你不想使用套接字,但似乎它们最适合这个。您可以让客户端通过socket.io 连接,然后将数据发送到单个(单个)套接字直到完成。
  • 你知道吗?你是对的。我应该让客户端通过套接字连接而不是通过 http 发送“请求”,然后将消息发送回给那个人。

标签: javascript jquery ajax http node.js


【解决方案1】:

我希望是不可能的:您不能发出 xhr http 请求并保持打开状态,一次解析块。

这里是大家的建议总结

  1. 无论如何都要使用 socket.io,并更改您的架构以支持推送事件。
  2. 使用 socket.io,但通过它发出请求,就好像你在访问 url。在 socket.io 的服务器端制作一个小 url 路由器,然后根据需要将内容流下来。
  3. 保持初始 html 页面打开并随时解析(对于我的实现不可行)
  4. (3),但在隐藏的 iframe 中。

我选择了 2 个。

【讨论】:

    【解决方案2】:

    作为对这个问题的更新,现在,您可以使用服务器发送事件 (SSE)。这样,您就不需要在服务器端做任何特别的事情,或者设置 websockets,当您不需要全双工时,这有点过分了。 XHR 会将整个数据保存在内存中,这对于大文件来说并不理想。我有同样的问题,我在这里回答:

    How to process streaming HTTP GET data?

    【讨论】:

      【解决方案3】:

      几年前,我在开放的 http 响应上使用“javascript”流式传输。 (在 ajax 出现之前的几年)

      这里的想法:写成块

      <script type="text/javascript">do js stuff here</script> 
      

      对于您希望客户做出反应的流程的每个步骤。

      它可能仍然有效。

      【讨论】:

      • 将信息写入页面并不难。随着时间的推移,它会从服务器获取大量数据。
      • 我的意思是在服务器控制的时间在响应和刷新服务器中编写
      • 酷。我不明白的是:如何设置一个“永无止境”的客户端请求?
      • 只有在需要使用 js 脚本标签流进行报告的操作结束时才关闭响应服务器端。(可能会持续多久)
      • oooohhh,你是说保持主 HTML 页面打开,而不是 xhr。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-20
      • 2019-07-02
      • 1970-01-01
      • 2011-11-22
      • 2012-01-02
      • 1970-01-01
      • 2019-01-07
      相关资源
      最近更新 更多