TCP соединение с удаленным сервером - PullRequest
1 голос
/ 13 апреля 2020

Я довольно плохо знаком с проблемами, связанными с TCP и соединением с сервером. Мне было поручено реализовать функцию, чтобы проверить, открыт ли или закрыт порт пользователей, подключенных к нашим серверам, чтобы определить, когда показывать им сообщение на веб-интерфейсе, информируя их о состоянии портов.

После стольких исследований я все еще не могу понять, как сделать это соединение, функция должна работать на внешнем интерфейсе, и это делает его еще сложнее. Я попытался реализовать эту же функцию в бэкэнде и смог добиться того, чего хотел, с помощью этого npm пакета . Но так как этот пакет зависит от net пакета NodeJs, я не могу использовать его на стороне клиента.

Я решил реализовать некоторые пользовательские функции с помощью WebSockets и даже изображений, но вместо получения статуса соединения браузер всегда выдает ошибку net:: ERR_EMPTY_RESPONSE.

Ниже приведены некоторые коды, которые я написал до сих пор, чтобы попытаться выяснить, в чем может быть проблема. Я был бы очень признателен за указание в правильном направлении. Спасибо

export const checkSocketIoConnect = (url, timeout) => {
    return new Promise(function(resolve, reject) {
        let errAlready = false;
        timeout = timeout || 50000;
        let socket = io(url, {
            transport: ['websocket'],
            reconnection: true, timeout: timeout, reconnectionDelay: 1000,
            reconnectionAttempts: 50,
            rejectUnauthorized: false
        });

        // success
        socket.on('connect', function() {
            console.log('connecting succesfulyy');
            clearTimeout(timer);
            resolve();
            socket.close();
        });

        // set our own timeout in case the socket ends some other way than what we are listening for
        let timer = setTimeout(function() {
            console.log('timer');
            timer = null;
            error('local timeout');
        }, timeout);

        // common error handler
        const error = (data) => {
            console.log('errrror');
            if (timer) {
                clearTimeout(timer);
                timer = null;
            }
            if (!errAlready) {
                errAlready = true;
                reject(data);
                socket.disconnect();
            }
        };

        // errors
        socket.on('connect_error', error);
        socket.on('connect_timeout', error);
        socket.on('error', error);
        socket.on('disconnect', error);

    });
};
export const newPortChecker = (url) => {
    let websocket = new WebSocket(url);
    // websocket.send('pinging server');
    websocket.onopen = function(event) {
        setInterval(() => {
            websocket.send('ping');
        }, 30000);
        console.log(event);
    };

    websocket.onmessage = function(event) {
        console.log(event.data);
    };

    websocket.onerror = function(event) {
        console.log(event);
    };

    websocket.onclose = function(event) {
        console.log(event);
    };
};
export const portChecker = (cb, host, port, timeout) => {
    let timeouts = (timeout == null) ? 100 : timeout;
    let img = new Image();

    img.onerror = function() {
        if (!img) return;
        img = undefined;
        console.log('open');
        cb('open');
    };

    img.onload = img.onerror;
    img.src = 'https://' + host + ':' + port;

    setTimeout(function() {
        if (!img) return;
        img = undefined;
        console.log('closed');
        cb('closed');
    }, timeouts);
};

1 Ответ

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

Я смог решить эту проблему, воспользовавшись найденным пакетом. Пакет использует изображения в DOM. Вот он, для тех, кто хочет решить эту проблему позже в будущем. https://github.com/ItsAsbreuk/itsa-browser-portscan

...