1

我最近使用 PeerJS 开发了一个 Web 应用程序,并正在尝试添加重新连接功能。

基本上,我的应用程序由创建客户端然后连接到的服务器工作。服务器人员可以控制主机正在做什么,但它是基本的双向通信。

如果客户端断开连接,他们只需重新连接即可正常工作。但是,如果服务器用户刷新页面,或者他们的计算机崩溃,那么他们需要能够重新建立对客户端的控制。

首先是重新获得原始连接 ID 和对等 api ID,这很好也很容易,因为它们存储在数据库中并分配了一个唯一的 ID,服务器用户可以使用它来查询它们。然后为了使客户端重新连接,我在关闭时执行此操作:

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

});

这似乎可行,因为在服务器端,客户端看起来已经重新连接 - 连接功能已触发等。但是无法在两者之间发送消息,并且客户端控制台说:

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

上面显示“打开”事件已被收听的地方......

我希望这很清楚 - 任何帮助表示赞赏:)

4

1 回答 1

1

所以最后要创建一个自动重新连接脚本,我只是处理了客户端的事情,确保服务器设置为相同的 api_key(对于云服务器)和密钥:

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

});

启动对等点将尝试启动新对等点的位置。为确保连续性,来自客户端的新 ID 替换来自客户端的旧 ID,一切顺利。最后最难的部分是让“setInterval”只触发一次,这是通过使用布尔标志实现的(糟糕......)。

感谢任何阅读并认为他们可以提供帮助的人:)

于 2016-05-06T01:16:53.597 回答