Javascript 为什么我的WebRTC连接只能在本地网络上工作?
我正在试验Javascript 为什么我的WebRTC连接只能在本地网络上工作?,javascript,webrtc,Javascript,Webrtc,我正在试验WebRTC,只是在数据通道上建立聊天。我有一个问题,当两个对等点连接在同一个本地网络上时,聊天可以正常工作。同龄人尝试从不同的网络连接(我已经用两台计算机进行了测试,一台连接到我的家庭互联网网络,另一台通过我的手机wifi路由器) 聊天的行为似乎很好,提供和应答通过信令服务器正确发送。并且,对于相同的信令服务器,ice候选者也被发送 peer.onicecandidate = (iceEvent: RTCPeerConnectionIceEvent) => { if (ic
WebRTC
,只是在数据通道上建立聊天。我有一个问题,当两个对等点连接在同一个本地网络上时,聊天可以正常工作。同龄人尝试从不同的网络连接(我已经用两台计算机进行了测试,一台连接到我的家庭互联网网络,另一台通过我的手机wifi路由器)
聊天的行为似乎很好,提供
和应答
通过信令服务器正确发送。并且,对于相同的信令服务器,ice候选者也被发送
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
}
};
因此,创建报价
的对等方只发送一个ice候选人
,我认为这就是问题所在,因为创建答案
的对等方发送两个ice候选人
这里有什么问题?我应该什么时候打电话给addIceCandidate
这是示例控制台日志
,包含发送和接收的数据
对等提供连接:
已发送:连接对象{type:“CONNECT”,调用方:对象,被调用方:null,
文件室:对象,数据:null}
已接收:连接对象{类型:“连接”,调用方:对象,被调用方:
null,文件室:对象,数据:null}
发送:提供对象{类型:“提供”,调用方:对象,被调用方:对象,
房间:对象,数据:对象}
已发送:候选对象{类型:“候选”,调用方:对象,被调用方:
对象,房间:对象,数据:对象}
已发送:候选对象{类型:“候选”,调用方:对象,被调用方:
对象,房间:对象,数据:对象}
received:ANSWER对象{type:“ANSWER”,调用者:对象,被调用者:
对象,房间:对象,数据:对象}
接收:候选对象{type:“CANDIDATE”,调用者:对象,被调用者:
对象,房间:对象,数据:对象}
同行创建答案:
已发送:连接对象{type:“CONNECT”,调用方:对象,被调用方:null,
文件室:对象,数据:null}
received:OFFER对象{type:“OFFER”,调用者:对象,被调用者:对象,
房间:对象,数据:对象}
接收:候选对象{type:“CANDIDATE”,调用者:对象,被调用者:
对象,房间:对象,数据:对象}
接收:候选对象{type:“CANDIDATE”,调用者:对象,被调用者:
对象,房间:对象,数据:对象}
已发送:应答对象{类型:“应答”,调用方:对象,被调用方:对象,
房间:对象,数据:对象}
已发送:候选对象{类型:“候选”,调用方:对象,被调用方:
对象,房间:对象,数据:对象}
您需要使用服务器连接本地网络外部:
STUN(用户数据报协议[UDP]的会话遍历)通过
网络地址转换器[NAT])服务器允许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);
你可以看看
和web应用程序本身:根据路由器和/或防火墙的设置方式,您可能还需要配置STUN和TURN
请参阅以了解晕眩和转身之间的区别。我同意上面提供的答案,但当对称natting出现时,晕眩失败
为了无缝地工作,您需要安装TURN服务器,这也适用于对称NATT
该实现保持不变,但它在TCP协议上工作,这意味着它跟踪传输的每个数据包。实施情况如下:
var servers = { 'iceServers':[{ 'urls': 'turn:<turn-server-address>' }] };
connection = new RTCPeerConnection(servers);
var servers={'iceServers':[{'url':'turn:'}]};
连接=新的RTPeerConnection(服务器);
此植入的作用是发送TCP封装的turn请求,这些请求将被进一步解析并发送到收件人。@Vardius,您使用ip吗?有时它不适用于DNSYe我提供了stun ip地址如果在注销对象之前对其进行字符串化,可能会更容易找到错误的线索,例如console.log(“sent:,JSON.stringify(data))