将客户端从一个Node.js服务器重定向到另一个Node.js服务器

时间:2014-07-21 02:58:51

标签: node.js sockets redirect networking tcp

我正在创建一个这样的套接字服务器:

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

这将是我的主服务器,我决定在哪里重定向客户端(例如,我希望所有来自特定区域的客户端连接到特定服务器,但我希望主服务器决定,因为是不仅仅是关于地理区域,还有一些其他要分析的数据来决定在哪里重定向客户端。

我想以某种方式将客户端重定向到另一个Node.js服务器,该服务器运行在相同的“localhost”但不同的PORT而不会丢失套接字连接,并且没有过热/饱和“主服务器”,我希望它是清除通过它到达其他服务器的所有连接。

1 个答案:

答案 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);
}

正如我所说,这是一个简单的例子。在现实生活中,您可能希望进行一些更改,例如不在每个数据包上连接到客户端,而是保持持久连接。您可能还想了解上游服务器无法访问的情况。

您可能还希望使用async库之类的东西来确保在启动代理服务器之前所有客户端都已启动,因此不会丢失任何数据。