당신이 만들고있는 것은 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);
}
내가 말했듯이 이것은 단순한 예입니다. 실생활에서는 각 패킷의 클라이언트에 연결하지 않고 지속적인 연결을 유지하는 것과 같이 일부 변경을 원할 수 있습니다. 업스트림 서버에 도달 할 수없는 경우를 다루고 싶을 수도 있습니다.
비동기 라이브러리와 같은 것을 사용하여 프록시 서버를 시작하기 전에 모든 클라이언트가 가동되도록하여 데이터가 손실되지 않도록 할 수도 있습니다.
내 대답 좀 보셨습니까? –