2012-06-05 24 views
8

मैं node.js 0.6.18 का उपयोग कर रहा हूं, और निम्न कोड node.js को प्रत्येक दो अनुरोधों के बीच टीसीपी कनेक्शन बंद करता है (लिनक्स पर strace के साथ सत्यापित)। मैं node.js को एकाधिक HTTP अनुरोधों के लिए एक ही टीसीपी कनेक्शन का पुन: उपयोग कैसे करूं (यानी जीवित रहें)? कृपया ध्यान दें कि वेबसर्वर जीवित रहने में सक्षम है, यह अन्य ग्राहकों के साथ काम करता है। वेबसर्वर एक खंडित HTTP प्रतिक्रिया देता है।HTTP के साथ निरंतर अनुरोध कैसे भेजें 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

आप कभी भी इस यह पता लगाने के लिए सक्षम थे ? –

+0

नहीं, मुझे जवाब नहीं पता – pts

+7

आप यह जानना चाहते हैं कि कॉलिंग() कॉलिंग एक स्टैक मेमोरी रिसाव बनाएगी। ऐसा इसलिए है क्योंकि प्रत्येक अंत घटना कार्य() पर एक नई कॉल जोड़ती है, जब तक कि प्रत्येक कॉल का अंत ईवेंट पूरा नहीं हो जाता तब तक स्टैक को कभी भी जारी नहीं किया जाता है। इसके आसपास काम करने के लिए, आप "process.nextTick (काम)" पर कॉल करके कार्य() को दायरे से बाहर धक्का देना चाहते हैं; "। यह अंत हैंडलर को समाप्त करने की अनुमति देगा। – thesmart

उत्तर

9

मैं (strace के साथ सत्यापित) एक http.Agent बनाने और 1. करने के लिए अपने maxSockets संपत्ति की स्थापना अगर यह यह करने के लिए आदर्श तरीका है मैं नहीं जानता कि यह द्वारा काम करने के लिए प्राप्त करने में सक्षम था, हालांकि, यह आवश्यकताओं को पूरा करता है। एक बात जो मैंने नोटिस की थी कि http.Agent व्यवहार के बारे में दस्तावेज़ों ने दावा किया है कि व्यवहार में यह कैसे काम करता है, इसका सटीक वर्णन नहीं किया गया था। नीचे दिए गए कोड:

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

शायद यह शीर्ष प्रश्न के बारे में बिल्कुल चिंता नहीं करता है लेकिन आपके कोड ने मेरी समस्या हल की है। मैं एक कुकी सेट करने की कोशिश कर रहा था और 'सीधे' विकल्पों को संदर्भित कर रहा था, लेकिन अब मैं इसे शीर्षलेखों पर सेट कर रहा हूं: {} और मुझे पता है कि मेरे htttp/get/कुकीज़ अनुरोध ठीक काम कर रहे हैं। धन्यवाद! – user1321759

1

तुम सिर्फ सेट कर सकते हैं किया:

http.globalAgent.keepAlive = true 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^