我最近使用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.(…)
“开放”事件显示为已经听过上面的内容......
我希望这很清楚 - 任何帮助都表示赞赏:)
答案 0 :(得分:0)
所以最后创建一个自动重新连接脚本,我只是处理客户端的事情,确保服务器设置为相同的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"只使用布尔标志触发一次(严重......)。
感谢任何阅读并思考如何提供帮助的人:)