我正在使用 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
出于某种原因,如果我根本不提出要约或回答,而只是恢复候选人,数据流甚至可以正常工作;这种情况下的错误是双方的后一个错误。
这里发生了什么?我需要担心它,还是我可以继续努力?作为一个附带问题,这是解决这个问题的一种愚蠢的方法,显然是错过了替代方案吗?
编辑:根据这些错误,我现在还尝试了多种重新排序这些步骤的方法,并且没有得到太多的结果;但是,这种方法确实允许重新连接真正的连接,并且即使我更改手机上的网络也不会导致信号问题,因此我将继续测试这种方法的局限性。不过,我仍然想知道导致这些错误的确切原因,因为它们似乎并不一定表明它们似乎表明了什么。