用于实时扩展的 WebRTC
Posted
技术标签:
【中文标题】用于实时扩展的 WebRTC【英文标题】:WebRTC for realtime scaling 【发布时间】:2013-09-16 17:31:25 【问题描述】:我正在寻找一种廉价的解决方案,以便在一个频道中为许多用户实时扩展。
我正在使用 sockjs,但在谈论非常大的数字时缩放非常烦人。
我正在考虑使用 webrtc 来降低 p2p 的成本。服务器不会连接到所有用户,而是仅连接到有限数量的用户,然后这些用户将通过 webrtc 将数据分发到 p2p 网络。这是明智的吗?最简单的实现方法是什么?
信息不是私密的,几秒
【问题讨论】:
【参考方案1】:是的,这就是 webRTC 的用途:在没有服务器的浏览器之间交换数据。为了完成这项工作,您可能需要在管理连接的服务器上考虑一些管理计划(因为一个客户端需要告诉另一个客户端'嘿,我在这里,连接到我..'),并考虑哪些部分当客户端需要连接到其他人时,数据在哪个客户端上。
作为提示:我使用 websockets(和 nodejs 插件:'ws')在 nodejs 中创建了一个服务器,以在客户端之间进行通信,直到设置 RTC 以便它们可以流式传输音频。做所有这些事情真的很容易,但要改进却很痛苦。
我从您的问题中了解到,您没有使用 webRTC 的经验。只是为了让您抢先一步,这是制作 RTC 所需的正确顺序:
Client 1 Server Client 2
Create an RTC object
Create offer
set localdescription = offer Create RTC object
send offer -------------------> ------>set remote description to offer
Create answer
local description = answer
set remote description<-------- <------send answer
This goes both directions:
onicecandidate send ----------> ------>set ICE candidate
Connection done!
为了交换这个连接数据,我的建议是使用 websockets。两个客户端都打开一个 websocket,每当一个客户端发送一些东西时,你可以从另一个客户端获取 websocket 连接(它是一个对象)并发送东西。使用 XHR,您只能让浏览器连接,请求数据,如果数据不存在,则在 x 秒内重试。
sum:为点对点连接使用和设置 webRTC 相当容易,但管理谁应该连接谁会很麻烦。
编辑: 我的想法是第一个客户端连接到服务器,并通过 XHR 或 websockets 或类似的东西接收它的数据。如果您想要浏览器兼容性,您可能想要使用socket.io,但这并不重要,因为只有 chrome 和 firefox 支持 webRTC (afaik)。然后,您只需从浏览器连接到服务器。如果您确实计划同时进行多个交换,则会话 ID 会非常方便,这样您就可以与需要下载它的人交换它。
在服务器端,websockets 返回一个“包含”当前连接的对象。因此,如果客户端 1 将连接,您将其存储在具有我们创建的 ID 的对象中。如果客户端 2 可以连接,您也可以存储它。然后你可以从第一个客户端获取 websocket 对象并执行.send('your message')
。
现在我真的会怎么做。我将使用 (ws) 来确定通过 websocket 的连接, (http) 用于 http 请求, (rtc) 用于 webRTC。 pc
是您的对等连接对象:window.dc = new RTCDataChannel(ICEServers);
。 sdp
表示SessionDescriptionProtocol
,
-
客户端连接到您的服务器并下载必要的文件 (http)(我指的是网页、脚本和 css,而不是您要共享的文件。)
客户端请求新会话。 (ws)
服务器在对象内创建会话实例。
var sessID = Math.random().toString(36).substring(12, 16); 会话[sessID] = ;
您将此会话 ID 发送给客户端 (ws),以便它可以将其发送给其他人(使用邮件等)。另一个用户连接到服务器(http)(ws),但不请求ID,它发送它。
当服务器收到此消息时,它会同时向第一个客户端和该客户端发送一条消息,其中包含双方都准备就绪的消息。发送客户端创建一个新的 webRTC 对象,并创建一个新的报价(它将这个报价存储在 dc.setLocalOffer(sdp) 中)。它将它发送到服务器(ws),服务器将它发送到客户端 2(ws)。现在客户端使用dc.setRemoteDescription(sdp)
存储它,并创建一个答案。 (dc.createAnswer()
),设置这个答案(dc.setLocalDescription(sdp)
。这个答案被发送给客户端一。现在你可以使用数据通道了。
我不知道数据通道是如何工作的,因为我只是working with PeerConnection,专门用于音频和视频流。您可以使用它来了解如何建立连接。代码在my repo 中。里面还有很多代码,因为这是一个“profielwerkstuk”(学校的一些工件,我和朋友一起做的)。你感兴趣的东西是 server.js(这是 nodejs 服务器,用于交换 sdp 和 ICE 候选者)。该网页位于 htdocs/mp.html 中(不是很有趣),用于执行此操作的一段 javascript 代码位于 htdocs/scripts/rtc.js 上。
有关更多信息,您可能需要查看this example 和explainments here
已经有'something you want',它使用了大量的代码来实现这一点。 另请注意,*** 是提出问题,而不是要求现成的代码。如果您愿意,请查看 carreers 2.0,并找到愿意为您执行此操作的人。
编辑 2: 现在我看到了你的答案,我认为最好的方法是将所有连接存储在会话对象内的数组中,然后连接客户端 1 -> 2、2-> 3、3-> 4 等。但是很好那么你有零件等问题。想想洪流,你可以连接到多个人并从每个人下载小部分。这真的很难,是的,而且我认为没有人已经做了这么大的事情(除了 sharefest)。如果你真的想做到这一点,你需要自己做最多的事情。花点时间思考如何解决这个问题,并使用 ***(或其他信息网站)寻找如何设置 rtc 等。
【讨论】:
谢谢,我喜欢这个答案! 回复得很快!如果您想了解更多信息,请告诉我!我一直在努力理解这一切,但我不希望别人这样做! 我看到你甚至增加了赏金。这个答案是否不够完整(因为没有真正的“问题增强”编辑关于您现在已经阅读这些答案想要知道的内容),还是您想要更详细的答案? 我觉得我只是希望有人说话更有权威,有人做过并且知道其中的陷阱等等,也许是一些有用的代码。你的回答很好,但我知道这比你在图表中解释的要复杂得多。 对于链接对等点来说要多得多。对于做图中的事情,它只是多一点。使用 nodejs 和 ws 插件,你可以很容易地做到这一点。您希望程序的哪一部分添加更多代码?我现在将编辑我的答案,并了解我将如何做到这一点。【参考方案2】:完全明智。
WebRTC 是浏览器中的低延迟 P2P 网络。如果用户的浏览器支持 DataChannel,那么您可以使用 WebTorrent https://github.com/feross/webtorrent 之类的库。
还可以查看 Sharefest 的实现:https://www.sharefest.me/ 它与您正在寻找的想法非常相似。
要开始使用,请查看 HTML5 Rocks WebRTC 教程:http://www.html5rocks.com/en/tutorials/webrtc/basics/。 SimpleWebRTC 库也很方便:http://simplewebrtc.com/
【讨论】:
【参考方案3】:是的,这是非常明智的,WEBRTC 是实时通信的下一个重要因素!使它如此明智的是它是用 Javascript 完成的。随着时间的推移,它正在以数百万的速度增长,并在更多平台上得到支持。物美价廉!
我不是来抨击你或任何事情的,但 webrtc 总有一天会把 Node 从水中吹走。
选择webrtc,你知道你想;)
【讨论】:
我不知道这会如何让 node 崩溃,因为您仍然需要一些服务器来交换数据以建立实时连接,而 nodejs 非常适合。他们一起工作,通过 websocket 交换会话描述和 ICE 候选人。 我不是来打你什么的,但土豆总有一天会把拖拉机从水里吹出来。以上是关于用于实时扩展的 WebRTC的主要内容,如果未能解决你的问题,请参考以下文章
基于WebRTC开源框架的实时视频聊天项目,搭建私人实时通信服务
Cloudflare WebRTC Components以开发人员为先的实时平台