2014-07-21 3 views
0

Я создаю сокет сервера так:Перенаправление клиентов с одного сервера Node.js на другой сервер Node.js

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

Это будет мой главный сервер, где я решу, куда перенаправить клиента (например, я хочу, чтобы все клиенты, которые пришли из определенной области, подключались к определенному серверу, но я хочу, чтобы главный сервер решал, потому что это не только географическая область, но и некоторые другие данные для анализа, чтобы решить, где перенаправить клиент).

Я хочу как-то перенаправить клиента на другой сервер 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); 
} 

Как я уже сказал, это упрощенный пример. В реальной жизни вы можете внести некоторые изменения, например, не подключаться к клиентам по каждому пакету, а поддерживать постоянное соединение. Вероятно, вы также захотите осветить случай, когда восходящий сервер недоступен.

Возможно, вы захотите использовать что-то вроде асинхронной библиотеки, чтобы все клиенты встали перед запуском вашего прокси-сервера, чтобы данные не были потеряны.

Смежные вопросы