我正在试验WebRTC
,只是在data channel
上建立聊天。我有一个问题,当两个对等体连接在同一本地网络上时,聊天工作。同行尝试从不同网络连接的地方(我一直用两台计算机连接到我的家庭互联网网络,另一台通过我的手机wifi路由器测试)。
聊天的行为似乎很好,offer
和answer
通过信令服务器正确发送。使用相同的信令服务器,也会发送ice candidate
。
peer.onicecandidate = (iceEvent: RTCPeerConnectionIceEvent) => {
if (iceEvent.candidate) {
const message: ConnectionEvent = {
type: ConnectionEventType.CANDIDATE,
caller: null,
callee: event.caller,
room: event.room,
data: iceEvent.candidate,
};
ws.send(message);
} else {
// All ICE candidates have been sent
}
};
因此,创建offer
的对等方仅发送 ONE ice candidate
,我认为这是问题,因为创建answer
的对等方发送 TWO < / em> ice candidates
。
这里有什么问题?我该什么时候打电话给addIceCandidate
?
这是示例console log
,已发送和已收到数据
同行提供连接:
sent:CONNECT Object {type:“CONNECT”,caller:Object,callee:null, room:对象,数据:null}
收到:CONNECT Object {type:“CONNECT”,caller:Object,callee: null,room:Object,data:null}
已发送:OFFER对象{类型:“OFFER”,调用者:对象,被调用者:对象, room:对象,数据:对象}
sent:CANDIDATE Object {type:“CANDIDATE”,caller:Object,callee: 对象,房间:对象,数据:对象}
sent:CANDIDATE Object {type:“CANDIDATE”,caller:Object,callee: 对象,房间:对象,数据:对象}
收到:ANSWER对象{type:“ANSWER”,来电者:对象,被叫者: 对象,房间:对象,数据:对象}
收到:CANDIDATE对象{type:“CANDIDATE”,caller:Object,callee: 对象,房间:对象,数据:对象}
同行创建答案:
sent:CONNECT Object {type:“CONNECT”,caller:Object,callee:null, room:对象,数据:null}
收到:OFFER对象{type:“OFFER”,来电者:对象,被调用者:对象, room:对象,数据:对象}
收到:CANDIDATE对象{type:“CANDIDATE”,caller:Object,callee: 对象,房间:对象,数据:对象}
收到:CANDIDATE对象{type:“CANDIDATE”,caller:Object,callee: 对象,房间:对象,数据:对象}
发送:ANSWER对象{类型:“ANSWER”,调用者:对象,被调用者:对象, room:对象,数据:对象}
sent:CANDIDATE Object {type:“CANDIDATE”,caller:Object,callee: 对象,房间:对象,数据:对象}
答案 0 :(得分:3)
您需要使用STUN服务器进行本地网络外的连接:
STUN(用户数据报协议的会话遍历[UDP]通过 网络地址转换器[NATs])服务器允许NAT客户端(即IP 防火墙后面的电话)设置拨打VoIP提供商的电话 托管在本地网络之外。
例如Google STUN服务器:
var servers = { 'iceServers': [{ 'urls': 'stun:74.125.142.127:19302' }] };
//var _iceServers = [{ url: 'stun:74.125.142.127:19302' }], // stun.l.google.com - Firefox does not support DNS names.
connection = new RTCPeerConnection(servers);
您可以查看my code。
Web应用程序本身:https://signalrtc.com/
答案 1 :(得分:1)
我同意上面提供的答案,但是当对称natting出现时STUN失败了。
为了让它无缝地工作,你需要有TURN服务器,它也适用于对称natting。
实现保持不变,但它适用于TCP协议,这意味着它跟踪传输的每个数据包。实施如下:
var servers = { 'iceServers':[{ 'urls': 'turn:<turn-server-address>' }] };
connection = new RTCPeerConnection(servers);
这种植入的作用是发送TCP封装的转弯请求,这些请求会进一步解析并发送给收件人。
答案 2 :(得分:0)
根据路由器和/或防火墙的设置方式,您可能还需要同时配置STUN和TURN。
请参阅Introduction to WebRTC protocols以了解STUN和TURN之间的区别。