Как получить экземпляр существующего сервера в Node.js? - PullRequest
4 голосов
/ 18 апреля 2020

Я хотел бы получить количество подключений нескольких серверов, работающих на моем локальном компьютере.

Я успешно использовал server.getConnections() на сервере, созданном с помощью net.createServer(), однако я не знаю, как использовать его на уже запущенном сервере.

Я попытался получить экземпляр сервера, подключившись к нему, используя net.connect(). Соединение успешно установлено, и я получаю новый объект net.Socket, однако, насколько я понимаю, мне действительно нужен net.Server для использования getConnections().

Итак, мой вопрос: как мне получить net.Server экземпляр уже запущенного сервера?

Ответы [ 4 ]

0 голосов
/ 28 апреля 2020

Я понимаю, что мой вопрос - проблема XY, поэтому извиняюсь перед всеми, кто пытался на него ответить.

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

Я должен был добавить больше деталей к вопросу, особенно то, что я пытался достичь.

Мое приложение представляет собой балансировщик нагрузки / обратный прокси-сервер. Сначала я мог использовать getConnections(), потому что я запускал прокси-сервер и несколько фиктивных серверов из одного и того же сценария. Однако я хотел отделить фиктивные серверы и прокси-серверы друг от друга, поэтому, хотя у меня был полный контроль над ними, мне нужно было притвориться, что я на самом деле не являюсь владельцем серверов.

Решение, которое я в моем конкретном случае c, в конце концов, я вел список серверов ha sh, к которым я могу подключиться (через обратный прокси-сервер), и увеличивал счетчики соединений при каждом подключении к указанному c сервер:

let servers = [
  { port: 4000, connectionsCounter: 0 },
  { port: 5000, connectionsCounter: 0 },
  { port: 6000, connectionsCounter: 0 },
];

let myProxyServer = net.createServer((socket) => {
  // Open a connection to the first server in the list
  net.connect(servers[0].port, () => {

    // Once connected, increment the connections counter
    socket.on('connect', () => {
      servers[0].connectionsCounter++;
    });

    // When the connection ends, decrement the counter
    socket.on('close', () => {
      servers[0].connectionsCounter--;
    });
  });
});

Надеюсь, это кому-нибудь пригодится.

0 голосов
/ 25 апреля 2020

Вы можете создать экземпляр net.createServer(), а затем получить количество соединений от server.on('connection', <callback>):

server.on('connection', (socket) => {
    // someone connected
    console.log("New active connection");
    server.getConnections((err, count) => {
        if(err){
            console.log(err);
        } else {
            console.log("Currently " + count + " active connection(s)");
        }
    });
});

Я надеюсь, что этот полный пример кода поможет вам:

const net = require('net');
const uuid = require('uuid/v1');

const server = net.createServer((socket) => {

    socket.uuid = uuid();

    socket.on('data', (data) => {
        //const response = JSON.parse(data.toString('utf8'));
    });

    socket.on('error', (err) => {
        console.log('A client has left abruptly !');
        server.getConnections((err, count) => {
            if(err){
                console.log(err);
            } else {
                console.log("Currently " + count + " active connection(s)");
            }
        });
    });

    socket.on('end', () => {
        console.log("A client has left");
        server.getConnections((err, count) => {
            if(err){
                console.log(err);
            } else {
                console.log("Currently " + count + " active connection(s)");
            }
        });
    });
});

server.on('error', (err) => {
  // handle errors here
  console.log("Error:", err);
});


server.on('connection', (socket) => {
    // someone connected
    console.log("New active connection");
    server.getConnections((err, count) => {
        if(err){
            console.log(err);
        } else {
            console.log("Currently " + count + " active connection(s)");
        }
    });
});

// port number.
server.listen(3000, () => {
  console.log('opened server on', server.address());
});

или вы можете использовать netstat для получения номера соединения, модуль https://www.npmjs.com/package/node-netstat nodejs для этого решения:

const netstat = require('node-netstat');

myObject = {
    protocol: 'tcp',
};

setInterval(function () {
    let count = 0;

    netstat({
        filter: {
            local: {port: 3000, address: '192.168.1.1'}
        }
    }, item => {
        // console.log(item);
        count++;
        console.log(count);
    });
}, 1000);
0 голосов
/ 27 апреля 2020

Ваше приложение немного неясно.

Только сокет сервера может сообщить, сколько у него подключений. Вот почему, если вы создаете net.Server, вы можете получить доступ к этой информации из него.

Если вы хотите подключиться к приложению и запросить количество подключенных к нему клиентов, приложение, к которому вы подключаетесь, должно предоставить эту информацию вам, когда вы попросите. Это не та информация, которую предоставляет сокет - само приложение должно предоставить эту информацию.

Если вы пишете приложение, создавшее net.Server, вы можете создать еще один net.Server на другом порту, который вы затем можно подключиться к нему и запросить информацию о других клиентах в других его сокетах.

Если вы пытаетесь найти общее количество соединений с конкретным приложением, имеющим сокет, это приложение должно иметь возможность чтобы сказать вам, или, как упоминалось @ root, вам нужно спросить операционную систему, в которой работает приложение. Эта функция будет зависеть от ОС и, вероятно, потребует повышенных привилегий. Но рассмотрите возможность подключения к сокету на маршрутизаторе или устройстве IoT: это приложение может вообще не работать ни в одной ОС.

0 голосов
/ 23 апреля 2020

Если вы хотите просто использовать сервер, вы, вероятно, можете сохранить его как переменную при вызове net .createServer ()

const my_server = net.createServer();
// do what you want with it

my_server.getConnections();
my_server.listen();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...