【发布时间】:2022-01-18 21:04:01
【问题描述】:
我正在使用一个名为 wrtc 的 WebRTC npm 包和 node.js 的内置网络库。由于某种原因,我无法建立连接。我得到了错误:
C:\dev\WebRTCchat\node_modules\wrtc\lib\index.js:49
this._send(data);
^
DOMException [InvalidStateError]: RTCDataChannel.readyState is not 'open
'
at RTCDataChannel.send (C:\dev\WebRTCchat\node_modules\wrtc\lib\inde
x.js:49:8)
at C:\dev\WebRTCchat\clientA.js:35:35
有什么想法吗?所以这里是客户 A 代码(谁创建了报价)
clientA.js
const net = require('net');
const { RTCPeerConnection } = require("wrtc");
const connA = new RTCPeerConnection();
connA.onicecandidate = () => console.log("Ice candidate added. ");// + JSON.stringify(connA.localDescription));
const dc = connA.createDataChannel("channel");
dc.onmessage = e => console.log("Message -> " + e.data);
dc.onopen = () => console.log("Client connected!");
function delay(ms) {
return new Promise(res => setTimeout(res, ms));
}
function createSDPOffer() {
return new Promise(resolve => connA.createOffer()
.then(o => {
connA.setLocalDescription(o);
console.log("Local Description set!");
resolve(o);
}));
}
function getSDPAnswer(answer) {
connA.setRemoteDescription(answer).then(a => console.log("Remote description set!"));
}
const server = net.createServer();
server.on('connection', socket => {
createSDPOffer().then(offer => {
socket.write(JSON.stringify(offer));
})
socket.on('data', data => {
getSDPAnswer(JSON.parse(data));
delay(1000).then(() => dc.send("Hello I am client A"));
})
})
server.listen(1337, '127.0.0.1');
然后是客户 B(收到报价并创建答案的人)
clientB.js
const net = require('net');
const { RTCPeerConnection } = require("wrtc");
const connB = new RTCPeerConnection();
const socket = new net.Socket();
function delay(ms) {
return new Promise(res => setTimeout(res, ms));
}
socket.connect(1337, "127.0.0.1");
socket.on('data', (data) => {
getSDPOffer(JSON.parse(data));
sendSDPAnswer().then(a => socket.write(JSON.stringify(a)));
delay(2000).then(() => {
connB.dc.send("Hello I am B")
});
});
socket.on('close', () => {
})
function getSDPOffer(offer) {
connB.onicecandidate = () => console.log("Ice candidate added. "); //+ JSON.stringify(connB.localDescription));
connB.ondatachannel = e => {
connB.dc = e.channel;
connB.dc.onopen = () => console.log("Client connected!");
connB.dc.onmessage = e => console.log("Message -> " + e.data);
}
connB.setRemoteDescription(offer)
.then(() => console.log("Remote Description Offer set!"));
}
function sendSDPAnswer() {
return new Promise(resolve => {
connB.createAnswer()
.then(a => {
connB.setLocalDescription(a);
console.log("Local Description set!");
resolve(a);
});
})
}
【问题讨论】:
-
ice候补需要在远端交换和添加,而不是登录。
-
您能否提供更多关于如何做到这一点的信息?