2012-06-05 31 views
8

Estoy usando node.js 0.6.18, y el siguiente código hace que node.js cierre la conexión TCP entre cada dos solicitudes (verificado con strace en Linux). ¿Cómo hago que node.js reutilice la misma conexión TCP para múltiples solicitudes HTTP (es decir, keep-alive)? Tenga en cuenta que el servidor web es capaz de mantener vivo, funciona con otros clientes. El servidor web devuelve una respuesta HTTP fragmentada.¿Cómo enviar solicitudes consecutivas con HTTP keep-alive en node.js?

var http = require('http'); 
var cookie = 'FOO=bar'; 
function work() { 
    var options = { 
     host: '127.0.0.1', 
     port: 3333, 
     path: '/', 
     method: 'GET', 
     headers: {Cookie: cookie}, 
    }; 
    process.stderr.write('.') 
    var req = http.request(options, function(res) { 
    if (res.statusCode != 200) { 
     console.log('STATUS: ' + res.statusCode); 
     console.log('HEADERS: ' + JSON.stringify(res.headers)); 
     process.exit(1) 
    } 
    res.setEncoding('utf8'); 
    res.on('data', function (chunk) {}); 
    res.on('end', function() { work(); }); 
    }); 
    req.on('error', function(e) { 
    console.log('problem with request: ' + e.message); 
    process.exit(1); 
    }); 
    req.end(); 
} 
work() 
+0

fuera usted capaz de averiguar alguna vez esto ? –

+0

no, no sé la respuesta – pts

+7

es posible que desee saber que llamar a work() creará una pérdida de memoria de la pila. Esto se debe a que cada evento final agregará una nueva llamada a work(), nunca liberará la pila a menos que se complete el evento final de cada llamada. Para solucionar esto, es posible que desee sacar work() del ámbito llamando a "process.nextTick (work);". Esto permitirá que el alcance del controlador final termine. – thesmart

Respuesta

9

pude conseguir que esto funcione (verificado con strace) mediante la creación de un http.Agent y estableciendo su propiedad maxSockets a 1. No sé si esta es la forma ideal de hacerlo; sin embargo, cumple con los requisitos. Una cosa que sí noté es que lo que los documentos afirmaban sobre el comportamiento de http.Agent no describía con precisión cómo funcionaba en la práctica. Código de abajo:

var http = require('http'); 
var cookie = 'FOO=bar'; 
var agent = new http.Agent; 
agent.maxSockets = 1; 

function work() { 
    var options = { 
     host: '127.0.0.1', 
     port: 3000, 
     path: '/', 
     method: 'GET', 
     headers: {Cookie: cookie}, 
     agent: agent 
    }; 
    process.stderr.write('.') 
    var req = http.request(options, function(res) { 
    if (res.statusCode != 200) { 
     console.log('STATUS: ' + res.statusCode); 
     console.log('HEADERS: ' + JSON.stringify(res.headers)); 
     process.exit(1) 
    } 
    res.setEncoding('utf8'); 
    res.on('data', function (chunk) {}); 
    res.on('end', function() { work(); }); 
    }); 
    req.on('error', function(e) { 
    console.log('problem with request: ' + e.message); 
    process.exit(1); 
    }); 
    req.end(); 
} 
work() 

EDIT: Debo añadir que hice mis pruebas con Node.js v0.8.7

+0

Quizás no se refiere exactamente a la pregunta principal, pero tu código resolvió mi problema. Estaba intentando configurar una cookie y un referirme 'directamente' dentro de las opciones, pero ahora lo estoy configurando en los encabezados: {} y sé que mi solicitud de htttp/get/cookies funciona bien. ¡Gracias! – user1321759

1

sólo se puede establecer:

http.globalAgent.keepAlive = true 
Cuestiones relacionadas