Автоматическое Переподключение PeerJS

Я недавно разработал веб-приложение с помощью PeerJS и пытаюсь добавить функциональность повторного подключения.

В принципе, мое приложение работает, создавая сервер, к которому клиенты затем подключаются. Человек сервера может контролировать, что хосты делают, но его основное двустороннее общение.

Если клиент отключается, они просто повторно подключаются, и это работает нормально. Однако если пользователь сервера обновляет страницу или компьютер аварийно завершает работу, ему необходимо восстановить контроль над клиентами.

Это можно начать с восстановления исходного идентификатора подключения и идентификатора однорангового api, что очень просто и просто, так как они хранятся в базе данных и назначены уникальному идентификатору, который пользователь сервера может использовать для запроса. Затем, чтобы позволить клиенту снова соединиться, я делаю это при закрытии:

// connection is closed by the host involuntarily...
conn.on('close', function() { 

    // if the clients connection closes set up a reconnect request loop - when the host takes back control
    // the client will auto reconnect...

    connected = false;
    conn = null;

    var reconnect_timer = setInterval(function () {

        console.log('reconnecting...'); // make a fancy animation here...
        conn = peer.connect(connectionid, {metadata: JSON.stringify({'type':'hello','username':username})});    

        // upon connection
        conn.on('open', function() { // if this fails need to provide an error message... DO THIS SOON      
            // run the connect function...
            connected = true;
            connect(conn);      
        });

        // didnt connect yet
        conn.on('error', function(err) {
            connected = false;
        });

        if(connected === true) {
            clearInterval(reconnect_timer);
        }

    }, 1000);

});

Это, кажется, работает, так как на серверной стороне клиент выглядит так, как они переподключились — функция connect запустила и т.д. Однако сообщения не могут быть отправлены между, и клиентская консоль говорит:

Error: Connection is not open. You should listen for the `open` event before sending messages.(…)

Где событие’ open ‘ показано как прослушанное выше.

Я надеюсь, что это ясно — любая помощь ценится 🙂

1 ответ

  1. Таким образом, в конце концов, чтобы создать сценарий автоматического повторного подключения, я просто имел дело с клиентским концом вещей, гарантируя, что сервер был установлен на тот же api_key (для cloudservers) и ключ:

    peer = new Peer(return_array.host_id, {key: return_array.api_key});
    

    и после этого имеющ клиента, на закрытии соединения:

    // connection is closed by the host involuntarily...
    conn.on('close', function() { 
        // if the clients connection closes set up a reconnect request loop - when the host takes back control
        // the client will auto reconnect...
    
        peer.destroy();     // destroy the link
        connected = false;  // set the connected flag to false
        conn = null;        // destroy the conn
        peer = null;        // destroy the peer
    
        // set a variable which means function calls to launchPeer will not overlap
        var run_next = true;
    
        // periodically attempt to reconnect
        reconnect_timer = setInterval(function() { 
            if(connected===false && run_next===true) {
                run_next = false;   // stop this bit rerunning before launchPeer has finished...
                if(launchPeer(false)===true) { 
                    clearInterval(reconnect_timer); 
                } else run_next == true;
            }       
        }, 1000);
    
    });
    

    Где узел запуска попытается запустить новый узел. Для обеспечения непрерывности новый идентификатор клиента заменяет старый идентификатор клиента,и все происходит гладко. Самое сложное в конце концов было иметь» setInterval » только один раз, который достигается (плохо…) через использование логических флагов.

    Спасибо всем, кто читал и думал, как они могли бы помочь 🙂