【问题标题】:Send an http request and receive push data发送http请求并接收推送数据
【发布时间】:2014-02-24 22:07:11
【问题描述】:

我希望我的 Node.js 代码向另一台服务器发送一个 http 请求。使用下面的代码可以正常工作。我的问题是有问题的服务器应该推送数据,并且连接在请求后立即关闭。

例如,如果我使用浏览器打开页面,我会从服务器获取推送数据,并且我的页面会被浏览器刷新。问题是:我怎样才能在我的 Node 服务器中获取跟随我的 http 请求的推送请求(来自其他服务器)? 我尝试使用“keep-alive”,但这不会改变任何东西。

示例代码:

var http = require("http");
var agent = new http.Agent;

var options = {
  hostname: 'server.com',
  port: 80,
  path: '/',
  method: 'GET',
  agent: agent,
  headers: {
      'Connection':'keep-alive'
  }
};

var req = http.request(options, function(res) {
  console.log('STATUS: ' + res.statusCode);
  console.log('HEADERS: ' + JSON.stringify(res.headers));
  res.setEncoding('utf8');
  res.on('data', function (chunk) {
    console.log('BODY: ' + chunk);
  });
});

req.on('error', function(e) {
  console.log('problem with request: ' + e.message);
});

// write data to request body
req.write('data\n');
req.write('data\n');
req.end();

【问题讨论】:

  • 服务器推送是如何实现的?

标签: node.js push


【解决方案1】:

来自服务器的数据位于 chunk

res.on('data', function (chunk) {

HTTP 被认为是发送数据并关闭连接。 如果您正在运行 server.com,您可以重写您的应用程序以保持连接打开(就像普通套接字一样)。 但正如其他人建议的那样,我认为您可以使用其他技术,例如网络套接字或长轮询。

【讨论】:

    【解决方案2】:

    您的问题与实际上如何在技术上在浏览器中完成更新有关。除非您告诉我们实际发生了什么操作,否则我们无法告诉您如何复制浏览器操作。

    HTTP 是一个请求/响应协议,这意味着如果浏览器没有先打开到服务器的链接(带有请求),服务器就不能“推送”到浏览器。

    在我看来,您想为不属于您的网页创建自定义客户端,因此您必须构建您的应用程序以使其表现得像网页,因为您没有控制为页面提供服务的服务器。对吗?

    (顺便说一句,许多网站都有禁止您尝试开发的使用类型的服务条款。请确认您在使用您的应用程序的范围内)

    如果是这种情况,那么您要做的就是弄清楚页面加载后浏览器是如何连接到服务器的。有几种可能发生这种情况:

    1) 页面加载的 javascript 会定期在计时器上发出新的 AJAX 请求。如果这是正在发生的事情,那么您很幸运,您所要做的就是捕获该 AJAX 请求的结构,然后在您的应用中,在同一个计时器上发出一个新的 HTTP 请求。

    2) 页面向服务器打开一个 websocket,并且该 socket 接受来自服务器的传入数据。这有点不那么直截了当,但是有很多库(我想到了 socket.io)来建立这种连接。

    作为一个单独的问题,对于这两种方法中的任何一种,站点可能会传递凭据以供浏览器传回并成功建立这些连接,如果是这样,您必须能够获取这些凭据并使用它们。

    【讨论】:

    • 这个问题听起来像是长时间轮询,这与您提出的两个选项不同。
    • 长轮询仅与选项 1 略有不同,即忽略计时器,仅在最后响应时触发新请求。这份清单并不全面,只是引导他朝着正确的方向前进,因为没有足够的信息可以做其他事情。
    猜你喜欢
    • 2011-03-03
    • 2013-09-29
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多