2015-01-30 2 views
7

기본 연결을 open (keep-alive) 상태로 유지하기 위해 HTTP 클라이언트를 설정하려고하는데 node.js에서 동작이 문서와 일치하지 않는 것으로 보입니다 (http://nodejs.org/api/http.html#http_class_http_agent).node.js에서 HTTP 연결 유지

maxSockets 속성을 1로 설정하고 매 초마다 URL (예 : http://www.twilio.com/)을 요청하여 새 HTTP 에이전트를 만듭니다.

모든 요청시 소켓이 닫히고 새 소켓이 만들어지는 것 같습니다. 우분투 14.04에서 node.js 0.10.25와 0.10.36으로 이것을 테스트했습니다.

누구든지 계속 일하게 할 수 있습니까?

var http = require("http"); 

var agent = new http.Agent(); 
agent.maxSockets = 1; 

var sockets = []; 

function request(hostname, path, callback) { 
    var options = { 
     hostname: hostname, 
     path: path, 
     agent: agent, 
     headers: {"Connection": "keep-alive"} 
    }; 
    var req = http.get(options, function(res) { 
     res.setEncoding('utf8'); 
     var body = ""; 
     res.on('data', function (chunk) { 
      body += chunk; 
     }); 
     res.on('end', function() { 
      callback(null, res, body); 
     }); 
    }); 
    req.on('error', function(e) { 
     return callback(error); 
    }); 
    req.on("socket", function (socket) { 
     if (sockets.indexOf(socket) === -1) { 
      console.log("new socket created"); 
      sockets.push(socket); 
      socket.on("close", function() { 
       console.log("socket has been closed"); 
      }); 
     } 
    }); 
} 

function run() { 
    request('www.twilio.com', '/', function (error, res, body) { 
     setTimeout(run, 1000); 
    }); 
} 

run(); 
+0

'http.get()'콜백 내에'console.dir (res.headers.connection)'이 무엇을 보여줄까? – mscdex

+0

나는 이미 그것을 검사했고 호스트는 응답에 "Connection : keep-alive"헤더를 반환하여 연결을 계속 유지하도록 동의한다는 것을 나타냅니다. – quentinadam

답변

0

나는 그것이 노드 0.12+에서 작동해야 같아요 여기

는 코드입니다. 이 목적으로 다른 에이전트를 사용할 수도 있습니다. 예를 keep-alive-agent를 들어 당신이 원하는 것을 할 수 있습니다

var KeepAliveAgent = require('keep-alive-agent'), 
    agent = new KeepAliveAgent(); 
2

을 내가 연결 풀은 0.12에서 구현 된 틀리지 않는 경우. 당신에게 그런 다음 노드 0.12+를 사용하는 경우

var request = require('request') 
request.get('www.twilio.com', {forever: true}, function (err, res, body) {}); 

당신은 직접 HTTP 코어 모듈을 사용하려면 : 당신이 연결 풀에 앞서 0.12를 갖고 싶어

그래서 당신은 단순히 request 모듈을 사용할 수 있습니다

var agent = new http.Agent({ 
    keepAlive: true, 
    maxSockets: 1, 
    keepAliveMsecs: 3000 
}) 

을 주목 keepAlive: true 특성, 즉 오픈 소켓을 유지하기 위해 필요합니다 : 당신의 에이전트를 초기화하려면이 옵션을 사용할 수 있습니다.

request 모듈에도 에이전트를 전달할 수 있으며, 다시 0.12 이상에서만 작동합니다. 그렇지 않으면 내부 풀 구현이 기본값입니다.

+0

분명히, 내 게시물의 시점에서, Node.js의 최신 안정 버전은 0.10이고, 0.10 워드 프로세서에 링크 된 문서들입니다. 대답 주셔서 감사합니다, 나는 기회를 얻을 때 시도해 보겠다. (나는 임시 해결책을 구현했다.) – quentinadam

+0

게시일을 알지 못했습니다. 어쨌든, 여전히 내 대답은 유효합니다. – simo

0

는 아래

var agent = new KeepAliveAgent({ maxSockets: 1 }); 

var options = { 
    agent:agent, 
    headers: {"Connection":"Keep-Alive"} 
} 

try { 
    var client = Soap.createClient(url); 

    var result = client.myfirstfunction(args,options); 

//process result 
    result = client.mysecondfunction(args,options); 

} 

두 방법은 하나 개의 소켓 연결에 데이터를 반환를 호출 keepaliveagent

의 NPM 모듈을 사용 유성에서 날 위해 일했습니다. 각 메소드 호출시 옵션들을 넘겨 준다.