Nodejs http.ClientRequest套接字无法使用'数据'事件(暂停/流动模式?)

时间:2015-10-28 04:13:52

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

我正在研究Node.js http模块文档https://nodejs.org/api/http.html#http_event_connect_1中的代码。原始代码在屏幕上打印http响应数据。移动数据后#39;从地点(A)到(B)的事件回调,它只打印连接头HTTP/1.1 200 Connection Established ...但没有http体。该计划就在那里停止。套接字是否不会发出数据'事件或原因是什么?套接字似乎没有发出' end'事件要么。

我通过添加代码(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

1 个答案:

答案 0 :(得分:0)

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

希望有所帮助。