存储 WebRTC 连接以供以后使用的正确方法是什么?

问题描述

我正在使用 WebRTC 和 IndexedDB 实现分布式哈希表,但遇到了一个我无法找到正确解决方案的问题。我有一个简单的应用程序,我一直在使用它来探索 WebRTC,并且我成功地通过数据通道发送了数据。

为每个保存的节点都保持连接是不可能的,但每次重新发送信号也很笨拙。通常为此,您只需保存 IP、端口和 ID,但 WebRTC 需要的不止这些;下面是我用来尝试检索连接的代码,前一个会话的信息存储在“会话”对象中:

function retrieve() {
    console.log("Retrieving peer connection");
    pc = new RTCPeerConnection(pcConfig);
    pc.localStream = session.dataChannel;
    pc.onicecandidate = () => {};
    pc.onremovestream = (e) => console.log("Remote stream removed.");
    if(initiator) {
        pc.createOffer().then((sessionDescription) => {
            pc.setLocalDescription(sessionDescription);
        });
    } else {
        pc.createAnswer().then((sessionDescription) => {
            pc.setLocalDescription(sessionDescription);
        });
    }
    pc.setRemoteDescription(session.remoteDescription);    
    cands = session.candidates;
    cands.map((cand) => {
        pc.addIceCandidate(new RTCIceCandidate({
            sdpMLineIndex: candidate.label,candidate: candidate.candidate,}));
    });
}

这确实有效,但它会导致一些错误,我担心这可能表明存在问题。第一个发生在两端:

InvalidStateError: Cannot set remote answer in state stable

在我的测试中,第二个仅发生在产品方面:

InvalidStateError: Cannot add ICE candidate when there is no remote SDP

出于某种原因,如果我根本不提供或不回答,并且只是恢复候选人,数据流甚至可以正常工作;这种情况下的错误是双方的后一个错误

这是怎么回事?我需要担心它,或者我可以继续吗?作为一个附带问题,这是解决这个问题的愚蠢方法吗?显然错过了替代方案?

编辑:根据这些错误,我现在也尝试了多种重新排序这些步骤的方法,但结果并没有得到太多;但是,这种方法确实允许重新连接真正的连接,并且即使我在手机上更改网络也不会导致信令问题,因此我将继续测试这种方法的局限性。不过,我仍然想知道导致这些错误的确切原因,因为它们似乎并不一定表明它们似乎表明了什么。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...