这个最简单的答案是:发送一个回复。
但是如果您使用一个有序可靠的数据通道(默认情况下),您可能不需要发送回复。
有序可靠的数据通道
使用其中之一,您可以通过等待缓冲区大小减小来确定消息已发送:
const pc1 = new RTCPeerConnection(), pc2 = new RTCPeerConnection();
const channel = pc1.createDataChannel("chat");
chat.onkeypress = async e => {
if (e.keyCode != 13) return;
const before = channel.bufferedAmount;
channel.send(chat.value);
const after = channel.bufferedAmount;
console.log(`Queued ${after - before} bytes`);
channel.bufferedAmountLowThreshold = before;
await new Promise(r => channel.addEventListener("bufferedamountlow", r));
console.log(`Sent ${after - channel.bufferedAmount} bytes`);
chat.value = "";
};
pc2.ondatachannel = e => e.channel.onmessage = e => console.log(`> ${e.data}`);
pc1.onicecandidate = e => pc2.addIceCandidate(e.candidate);
pc2.onicecandidate = e => pc1.addIceCandidate(e.candidate);
pc1.oniceconnectionstatechange = e => console.log(pc1.iceConnectionState);
pc1.onnegotiationneeded = async e => {
await pc1.setLocalDescription(await pc1.createOffer());
await pc2.setRemoteDescription(pc1.localDescription);
await pc2.setLocalDescription(await pc2.createAnswer());
await pc1.setRemoteDescription(pc2.localDescription);
}
Chat: <input id="chat"><br>
由于通道是可靠的,因此在消息被接收之前,它不会停止发送该消息。
由于通道是有序的,所以在接收到此消息之前,它不会发送第二个消息。
这使您可以连续发送一堆消息而无需等待回复。只要bufferedAmount
保持下降,您就知道正在发送和接收。
简而言之,要确定已接收到消息,请发送第二条消息或让另一方发送回复。
不可靠的数据通道
如果您使用的是不可靠的数据通道,则发送回复是唯一的方法。但是,由于无法保证回复是否能够返回,这可能会产生错误的负面影响,在接收端产生重复的消息。
单向不可靠,另一方面是可靠的
使用negotiated构造函数参数,可以创建一个数据通道,在一个方向上不可靠,但在另一个方向上可靠。这可以用来解决不可靠的回复,避免接收端(pc2
)上的重复消息。
dc1 = pc1.createDataChannel("chat", {negotiated: true, id: 0, maxRetransmits: 0});
dc2 = pc2.createDataChannel("chat", {negotiated: true, id: 0});
bufferedAmountLowThreshold
。在实际的日志中使用多个消息之前,还需要进行一些工作。但我希望它能说明问题。 - jib