【问题标题】:Can I keep pushing data from the server to the same connection?我可以继续将数据从服务器推送到同一个连接吗?
【发布时间】:2012-12-04 14:56:08
【问题描述】:

我正在设置一个类似网页的股票代码,用 JavaScript 编写。我也在用 C++ 编写页面与之对话的服务器。

我想让网页高效,这样它就可以向应用服务器发送单个订阅消息,然后保持一个保持活动连接打开,不断接收从应用服务器推送的入站数据。

目前,每次从服务器接收数据时,我都必须重新发出网络客户端的订阅调用。问题是每次 XHR 对象命中 readyState(4) 时,调用就有效地完成了。在此之后到达网页的任何数据都将被忽略。 Web 客户端可以重新发送数据并重置对象,但发送是不必要的,仅用于重置 XHR 对象。

我想知道是否有可能以某种方式重置现有的 XHR 对象,并将其置于期望更多入站数据的状态,以便当更多数据推送到网页时,网页响应并处理它。

提前感谢您提供的任何帮助。注意:在这个项目中没有使用 JQuery。

【问题讨论】:

  • 不适用于 XHR(实际上,不适用于 HTTP)。你正在寻找Websockets
  • @bfavaretto,这应该是一个答案,而不是评论。 :)
  • @epascarello 有时候我太懒了! :) 添加了一些更好的答案。

标签: javascript ajax xmlhttprequest push


【解决方案1】:

我强烈建议研究 Websocket,尤其是像 socket.io 这样的库,它将各种浏览器的 Websocket 传输实现封装到单个 API(WS、JSON、JSONP、Flash 和 Long Polling)中。

现在所有主流浏览器都应该支持 Socket.io 客户端库。您唯一的挑战可能是找到特定于 C++ 的服务器实现。希望this SO 问题可能会有所帮助

否则,您唯一的其他选择是在客户端上进行长轮询或 Comet,并使用合适的可扩展的服务器端实现(即类似于 NginX 之类的事件驱动服务器,而不是每个连接的线程架构。)

我非常感谢您致力于 C++,但我的谦虚建议是尽可能地研究 Node.js,并且确实提供了一个非常高效的解决方案,而且只需很少的努力。

HTH,一切顺利。

【讨论】:

  • 同意,web-sockets 是未来,我有意识地避免它,因为它在旧浏览器中缺乏支持。我很欣赏您的回复,我将不得不继续寻找其他一些选项来提高长轮询的效率。干杯。
【解决方案2】:

HTTP 是一次性协议:一个请求,一个响应,然后就完成了。如果要保持连接打开,可以使用 Websockets (MDN reference page, client-side code example)。但是考虑到旧浏览器不支持它(例如,IE 刚刚在版本 10 上开始支持 Websockets),因此您可能需要使用 XHR 和long-polling 实现回退。

【讨论】:

  • 我在某处读到,XHR 可以通过让浏览器认为一个大文件以块的形式传送,从而被伪造为持续流式传输,但我找不到示例。 WebSockets 是理想的,但我至少在今年需要这种向后支持。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2011-05-11
  • 2020-05-01
  • 2019-01-28
  • 2012-08-30
  • 2021-06-23
  • 2021-09-21
  • 1970-01-01
  • 2014-02-01
相关资源
最近更新 更多