2016-05-05 15 views
0

Ich habe vor kurzem eine Web-App mit PeerJS entwickelt und versuche, Reconnect-Funktionalität hinzuzufügen.PeerJS Auto Reconnect

Grundsätzlich funktioniert meine app von jemandem dann eine Verbindung zu einem Server dass Kunden zu schaffen. Die Serverperson kann steuern, was die Hosts tun, aber ihre grundlegende Zwei-Wege-Kommunikation.

Wenn ein Client trennt, verbinden sie sich einfach neu und es funktioniert normal. Wenn der Serverbenutzer jedoch die Seite aktualisiert oder der Computer abstürzt, muss er die Kontrolle über die Clients wiederherstellen können.

Der Anfang davon ist durch Wiedererlangen der ursprünglichen Verbindungs-ID und der Peer-API-ID, die in einer Datenbank gespeichert und mit einer eindeutigen ID versehen ist, die der Serverbenutzer verwenden kann, um sie abzufragen. Dann den Client zu ermöglichen, ich dies wieder tun bei genauem:

// 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); 

}); 

Dies scheint zu funktionieren, wie es auf dem Server der Client-Seite sieht aus wie sie wieder angeschlossen haben - die Verbindungsfunktion hat usw. abgefeuert jedoch Nachrichten gesendet werden kann nicht zwischen, und der Client-Konsole sagt:

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

Wo die ‚offene‘ Ereignis oben zugehört ... gezeigt worden

haben ich hoffe, das ist klar - jede Hilfe ist willkommen :)

Antwort

0

Also am Ende ein Auto Reconnect Skript zu erstellen, habe ich einfach mit dem Kunden Ende der Dinge behandelt, wurde der Server sicherzustellen, auf die gleiche api_key gesetzt (für cloudservers) und Schlüssel:

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

ist und dann die Client bei der Verbindung der Schließung:

// 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); 

}); 

Wo Einführung Peer einen neuen Peer zu starten versucht. Um Kontinuität zu gewährleisten, ersetzt die neue ID vom Client die alte ID vom Client und alles ist eine reibungslose Übernahme. Der schwierigste Teil am Ende war, das "setInterval" nur einmal feuern zu lassen, was durch Verwendung boolescher Flags (schlecht ...) erreicht wird.

Danke an alle, die gelesen und gedacht haben, wie sie helfen könnten :)

Verwandte Themen