我正在创建一个这样的套接字服务器:
var net = require('net');
net.createServer(function (socket) {
//Run code here, to select where to redirect this client
}).listen(5000);
这将是我的主服务器,我决定在哪里重定向客户端(例如,我希望所有来自特定区域的客户端连接到特定服务器,但我希望主服务器决定,因为是不仅仅是关于地理区域,还有一些其他要分析的数据来决定在哪里重定向客户端。
我想以某种方式将客户端重定向到另一个Node.js服务器,该服务器运行在相同的“localhost”但不同的PORT而不会丢失套接字连接,并且没有过热/饱和“主服务器”,我希望它是清除通过它到达其他服务器的所有连接。
答案 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库之类的东西来确保在启动代理服务器之前所有客户端都已启动,因此不会丢失任何数据。