Переподключение веб-сокетов после ошибки занимает несколько секунд - PullRequest
0 голосов
/ 18 октября 2018

Я пытаюсь использовать веб-сокеты с Javascript, и я заметил, что медленно открывать его после сбоя соединения:

function start_socket() {
    var ws = new WebSocket("ws://localhost:8000");
    ws.onopen = function() {
        console.log("Socket opened");
    };
    ws.onmessage = function(e) {
        console.log("Received message: " + e.data);
    };
    ws.onclose = function(e) {
        start_socket();
    };
}

start_socket();

У меня очень простой сервер на localhost:8000, который просто отправляетвернуть сообщение, когда он получает соединение.Если сервер уже запущен, когда сценарий выполняется, он сразу же работает, но если я запускаю сценарий, а затем сервер, может потребоваться несколько секунд, чтобы получить сообщение.

Я пробовал другую версию:

var ntries = 0;

function start_socket() {
    ws = new WebSocket("ws://localhost:8000");
    ws.onopen = function() {
        console.log("Socket opened");
    };
    ws.onmessage = function(e) {
        console.log("Received message: " + e.data);
    };
    ws.onclose = function(e) {
        ntries++;
        console.log(ntries);
        start_socket();
    };
}

start_socket();

В этой версии я вижу в журнале, что число повторений увеличивается относительно медленно (иногда одна попытка выполняется сразу после последней, иногда это занимает несколько секунд).

Окончательная версия:

var ntries = 0;
var is_open = false;

function start_socket() {
    ws = new WebSocket("ws://localhost:8000");
    ws.onopen = function() {
        is_open = true;
        console.log("Socket opened");
    };
    ws.onmessage = function(e) {
        console.log("Received message: " + e.data);
    };
    ws.onclose = function(e) {
        is_open = false;
        ntries++;
        console.log(ntries);
        start_socket();
    };

    setTimeout(function() {
        if(! is_open)
            ws.close();
    }, 500);
}

start_socket();

Здесь число повторных попыток увеличивается каждые 500 мс, как ожидается, но требуется много повторных попыток, прежде чем он подключится к серверу.Иногда я даже не получаю сообщение, даже если его отправил сервер.

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