【问题标题】:Redirecting clients from one Node.js server to another Node.js server将客户端从一个 Node.js 服务器重定向到另一个 Node.js 服务器
【发布时间】:2023-04-02 04:07:01
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你看我的回答了吗?

标签: node.js sockets redirect networking tcp


【解决方案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);
}

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

您可能还想使用异步库之类的东西来确保在启动代理服务器之前所有客户端都已启动,这样就不会丢失数据。

【讨论】:

  • 不错的答案,我会通过管道传输流,而不是在 on(data) 中创建新连接。但是所有消息仍然会通过服务器的 5000 端口。我想知道是否有办法重定向 TCP 连接,比如 http 301。
猜你喜欢
  • 2017-01-09
  • 2020-04-21
  • 2018-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-03
相关资源
最近更新 更多