首页 > 解决方案 > 存储 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

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

这里发生了什么?我需要担心它,还是我可以继续努力?作为一个附带问题,这是解决这个问题的一种愚蠢的方法,显然是错过了替代方案吗?

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

标签: javascriptnetworkingwebrtcp2psignaling

解决方案


推荐阅读