2014-07-21 2 views
0

는이 같은 소켓 서버를 만드는거야 :리디렉션 클라이언트는

var net = require('net'); 
net.createServer(function (socket) { 
//Run code here, to select where to redirect this client 
}).listen(5000); 

이것은 내가 (클라이언트를 리디렉션 할 위치를 결정 내 마스터 서버가 될 것입니다 예를 들어 특정 지역에서 오는 모든 클라이언트가 특정 서버에 연결되기를 원하지만 마스터 서버가 결정하기를 원합니다. 왜냐하면 지리적 영역 만이 아니기 때문에 분석 할 다른 데이터가 어디에서 리디렉션 될지 결정하기 때문입니다. 고객).

"localhost"이지만 소켓 연결을 풀지 않고 다른 PORT를 실행하는 다른 Node.js 서버로 클라이언트를 리디렉션하고 싶습니다. "마스터 서버"가 과열되거나 포화되지 않도록하고 싶습니다. 이 다른 서버에 도달하기 위해 이동하는 모든 연결을 깨끗이하십시오.

+0

내 대답 좀 보셨습니까? –

답변

1

당신이 만들고있는 것은 TCP 프록시입니다. 나는 아래에 기본적인 것을 썼다. getServerBasedOnAddress 함수는 프록시 할 서버를 선택하는 곳입니다. 나는 당신이 필요로하는 논리를 모르기 때문에 여기에서 무작위로 하나를 선택했습니다.

var net = require('net'); 

// The servers we will proxy to 
var upstreamServerAddresses = [ 
    {address: '127.0.0.1', port: '3000'}, 
    {address: '127.0.0.1', port: '3001'}, 
    {address: '127.0.0.1', port: '3002'}, 
]; 

// This is where you pick which server to proxy to 
// for examples sake, I choose a random one 
function getServerBasedOnAddress(address) { 
    return upstreamServerAddresses[Math.floor((Math.random() * 3))] 
} 

// Create the proxy server 
net.createServer(function (socket) { 

    socket.on('data', function(data){ 
     upstream = getServerBasedOnAddress(socket.remoteAddress); 
     net.connect(upstream.port, upstream.address, function(connection){ 
      this.write(data); 
     }); 
    }) 

}).listen(5000, function(){ 
    console.log("Ready to proxy data"); 
}); 

// Create the upstream servers 
for(var i = 0; i < upstreamServerAddresses.length; i++){ 
    var upstream = upstreamServerAddresses[i]; 

    net.createServer(function (socket) { 
     socket.on('data', function(data){ 
      console.log("Received some data on " + upstream.address + ":" + upstream.port); 
      console.log(data); 
     }); 
    }).listen(upstream.port); 
} 

내가 말했듯이 이것은 단순한 예입니다. 실생활에서는 각 패킷의 클라이언트에 연결하지 않고 지속적인 연결을 유지하는 것과 같이 일부 변경을 원할 수 있습니다. 업스트림 서버에 도달 할 수없는 경우를 다루고 싶을 수도 있습니다.

비동기 라이브러리와 같은 것을 사용하여 프록시 서버를 시작하기 전에 모든 클라이언트가 가동되도록하여 데이터가 손실되지 않도록 할 수도 있습니다.

관련 문제