【问题标题】:Nodejs http.ClientRequest socket not working with 'data' event (paused/flowing mode?)Nodejs http.ClientRequest 套接字不适用于“数据”事件(暂停/流动模式?)
【发布时间】:2016-01-27 17:44:53
【问题描述】:

我正在研究 Node.js http 模块文档 https://nodejs.org/api/http.html#http_event_connect_1 中的代码。原始代码在屏幕上打印 http 响应数据。在我将“数据”事件回调从位置 (A) 移动到 (B) 后,它只打印连接标头 HTTP/1.1 200 Connection Established ... 而没有 http 正文。程序就停在那里。是套接字没有发出“数据”事件还是什么原因?似乎套接字也没有发出“结束”事件。

我通过添加代码 (C) 解决了这个问题,强制套接字以流动模式工作。但我不明白为什么没有代码(C)它就不能工作。

客户端部分代码如下:

// make a request to a tunneling proxy
var options = {
    port: 1337,
    hostname: '127.0.0.1',
    method: 'CONNECT',
    path: 'www.google.com:80'
};

var req = http.request(options);
req.end();

req.on('socket', function(res, socket, head) {  // Added for learning
    socket.on('data', function(chunk) {    // (B)
        console.log(chunk.toString());
    });
    // socket.resume();    // (C) FIX
});

req.on('connect', function(res, socket, head) {
    console.log('got connected!');

    // make a request over an HTTP tunnel
    socket.write('GET / HTTP/1.1\r\n' +
                 'Host: www.google.com:80\r\n' +
                 'Connection: close\r\n' +
                 '\r\n');
    // socket.on('data', function(chunk) {    // (A)
    //     console.log(chunk.toString());
    // });
    socket.on('end', function() {
        proxy.close();
    });
});

完整的原始代码在这里:https://nodejs.org/api/http.html#http_event_connect_1

【问题讨论】:

    标签: node.js sockets http node.js-stream


    【解决方案1】:

    我相信 (A) 有效而 (B) 无效的原因是因为 (A) 在您写入套接字后为数据事件分配了一个侦听器。当 (B) 为 data 事件分配一个监听器时,它发生在 socket.write 被调用之前。当调用 socket.write 时,它​​会暂停套接字,因此 socket.resume() 恢复数据读取模式。不过,我建议您使用新的流 API,因为它更加直观和灵活 (https://github.com/substack/stream-handbook)。

    希望对您有所帮助。

    【讨论】:

    • 谢谢!我不会使用旧的流 API。只是为了好玩,我想弄清楚套接字何时暂停。我阅读了“流手册”并深入研究了 node.js 源(网络模块和流模块),但我找不到它暂停套接字的位置。您会列出来源或链接(带有来源行号)吗?而如果我要调试这样的问题,该如何调试呢?
    • 我从来不需要去 node.js 源代码,所以我不知道在哪里可以找到暂停流的逻辑(它甚至可能在 C++ 级别)。要调试它,您可以使用节点检查器。您可以在两个回调中设置断点,并查看哪个首先触发以及调用流的某些方法时会发生什么。顺便说一句,我实际上并没有运行你的代码。我只是假设可能是什么原因,提供了您的代码和解释。
    猜你喜欢
    • 2012-04-06
    • 1970-01-01
    • 1970-01-01
    • 2019-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-30
    • 2016-02-28
    相关资源
    最近更新 更多