在没有ice/stun/turn服务器的隔离局域网上使用WebRTC

47

在孤立的局域网上,是否有办法只使用DHCP服务器分配的IP地址建立WebRTC连接呢?

我知道可以使用Node.js和Socket.io进行此操作,但是希望不需要使用这种服务器,因为我的能力有限。我是一位涉猎编程的科学教师,所以请保持简单易懂。谢谢!

更新

Alex,你说得对,如果所有计算机都在同一本地网络上,则可以避免使用STUN服务器。尽管我不得不安装Node.js在我的笔记本电脑上,但这真的并不复杂。然后我尝试了一堆没有用的“工作示例”,直到我发现这个和他的GitHub文件

运行Node中的服务器脚本后,在同一台机器的两个浏览器窗口之间建立了DataChannel连接,但不适用于不同的计算机。我编辑了.html文件,将其指向我的本地服务器IP地址,而不是localhost,然后就可以连接多台计算机了。然后进行了真正的测试-是否可以在没有互联网连接的情况下使用?我找到了指定使用Google的STUN服务器的行,并将其从

var config = {"iceServers":[{"url":"stun:stun.l.google.com:19302"}]};

改成了

var config = {"iceServers":[]};

它奏效了。 :-)


如果所有客户端都在本地网络中,我认为您可以避免使用STUN和TURN服务器。至少我的应用程序是这样工作的,当我需要连接到外部时才添加了STUN。您可以查看:https://chatroomone.azurewebsites.net/ - Alexan
@Alex - 感谢您的建议,但SignalR似乎也需要设置服务器。我可能不得不咬紧牙关设置本地服务器...但我被“点对点”、“浏览器对浏览器”的简单性所吸引。我只想让局域网上的用户能够在一个本地页面上输入内容,以便在另一个本地页面上显示出来。 - brainBanter
是的,我认为对于WebRTC信令你需要一些服务器部分:http://www.html5rocks.com/en/tutorials/webrtc/basics/#toc-signaling。我只是认为SignalR要简单得多,而且你可以下载示例:http://www.asp.net/signalr/overview/getting-started/tutorial-getting-started-with-signalr,但你需要一个支持ASP.NET的Web服务器,例如IIS。 - Alexan
你可能需要像这样的东西:https://mywebchat.azurewebsites.net,你可以使用它。 - Alexan
2
也许您可以将您的解决方案作为答案添加,并将此标记为已完成 :D? - timiTao
显示剩余9条评论
2个回答

15

省略iceServers列表:

const pc = new RTCPeerConnection();

省略iceServers列表或将其设为空列表[],都可以作为RTCPeerConnection构造函数的可选项。
来自RTCPeerConnection文档:
冰服务器 | 可选
一个RTCIceServer对象数组,每个对象描述可能被ICE代理使用的服务器;通常是STUN和/或TURN服务器。如果未指定,则连接尝试将在没有可用STUN或TURN服务器的情况下进行,这将限制连接到本地对等端。
webrtc/samples演示 WebRTC项目有一个Trickle ICE示例,您可以使用它来查看iceServers更改如何影响收集到的候选地址。您要查看的特定示例是。
  1. 按下页面底部的收集候选项按钮,以默认设置运行它。这将返回一个地址列表,其中包括您NAT公共侧的地址。

    Default ICE Servers

  2. 现在从列表中删除所有ICE服务器,再次按下收集候选项,这次您应该只能看到本地网络地址。

    No ICE Servers

请注意,在我的网络上,仅当我使用默认的ICE服务器时,2个公共IPv4地址(以98.开头)才会出现。当我使用空的ICE服务器列表时,我的公共IPv4地址不再被发现。另一方面,我的IPv6地址在两个测试中都相同,因为它们不受NAT的影响。

这里是设置iceServers和PeerConnection源代码的链接


2
浏览器通常不再提供默认的ICE服务器,因此不需要传入空的 []。我已经更新了MDN的文章以反映这一点。对于任何混淆引起的困扰请谅解。Firefox仍然有一个 about:config 预设来启用默认的ICE服务器,这可能是MDN所指的,但这是非标准的,可能不应影响MDN和普遍的Web编程建议。该示例提供了自己的服务器;它们不是“默认”的服务器。 - jib
1
只需调用 const pc = new RTCPeerConnection(); 即可。如果您想更新您的答案,我会点赞以将这个长期未回答的webrtc问题移出未回答列表。 ;) - jib
1
哦,我已经好几年没用webrtc了。那一定有所改变了。所以现在你是说必须显式调用getDefaultIceServers才能实现这种行为?https://www.w3.org/TR/webrtc/#dom-rtcpeerconnection-getdefaulticeservers - Doug Richardson
是的,我错过了他们在我链接的webrtc示例代码中明确设置服务器的部分。我会更新答案。 - Doug Richardson
2
由于缺乏实现,getDefaultIceServers()被标记为“风险功能”。Firefox的media.peerconnection.default_iceservers首选项按照您最初描述的方式工作,只是非标准且很少使用,因此我不会让Web开发人员担心它。特别是因为该功能不会阻碍通过局域网连接。 - jib
Zoom视频通话使用WebRTC而没有STUN / TURN服务器,这是否意味着它们正在使用getDefaultIceServers()来获取默认的STUN服务器?https://webrtchacks.com/zoom-avoids-using-webrtc/#datachannels - baptx

4
亲爱的Alex,你说得对,如果所有计算机都在同一本地网络上,我可以避免使用STUN服务器。虽然我不得不咬紧牙关在我的笔记本电脑上安装Node.js,但这并不复杂。之后我尝试了很多'有效例子',但它们对我来说都没用,直到我找到了这个人和他的GitHub文件。
在Node中运行服务器脚本后,我在同一台机器上的两个浏览器窗口之间建立了DataChannel连接,但不是在不同的计算机之间。我编辑了.html文件以指向我的本地服务器IP地址而不是localhost,然后就能够使用多台计算机连接了。接下来是真正的测试 - 我是否可以在没有互联网连接的情况下使用它?我找到了指定使用Google的STUN服务器的那一行,并将其从
var config = {"iceServers":[{"url":"stun:stun.l.google.com:19302"}]};
更改为
var config = {"iceServers":[]};

你能解释一下你是如何使用脚本获取数据通道的吗?谢谢。 - zolio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接