2012-06-05 149 views
8

我正在使用node.js 0.6.18,並且以下代碼使node.js關閉了每兩個請求之間的TCP連接(在Linux上使用strace進行了驗證)。如何讓node.js爲多個HTTP請求重用相同的TCP連接(即保持活動狀態)?請注意,網絡服務器能夠保持活力,它可以與其他客戶端協同工作。 Web服務器返回分塊的HTTP響應。如何在node.js中使用HTTP keep-alive連續發送請求?

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

是你能不斷想出解決辦法? –

+0

不,我不知道答案 – pts

+7

你可能想知道調用work()會產生堆棧內存泄漏。這是因爲每個結束事件都會向work()添加一個新的調用,除非每次調用的結束事件都完成,否則不會釋放堆棧。 要解決這個問題,您可能需要通過調用「process.nextTick(work);」來推送work()超出範圍。這將允許終止處理程序的作用域終止。 – thesmart

回答

9

我能夠通過創建一個http.Agent及其maxSockets屬性設置爲1。我不知道這是做理想的方式來得到這個工作(與strace的驗證);但是,它確實符合要求。我注意到的一件事是,文檔聲稱的行爲沒有準確地描述它在實踐中是如何工作的。下面的代碼:

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() 

編輯:我要補充一點,我做了我使用的是Node.js v0.8.7測試

+0

也許它並不關心頂級問題,但你的代碼解決了我的問題。我試圖在選項中設置一個cookie和一個「直接」引用,但現在我將它設置在標題中:{}並知道我的htttp/get/cookies請求正常工作。謝謝! – user1321759

1

你可以設置:

http.globalAgent.keepAlive = true