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