1

我正在研究来自 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

4

1 回答 1

0

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

希望有帮助。

于 2015-11-02T03:03:11.660 回答