22

我正在为 1 个频道中的许多用户寻找实时扩展的廉价解决方案。

我正在使用 sockjs,但在谈论非常大的数字时,缩放非常烦人。

我正在考虑使用 webrtc 来降低 p2p 的成本。服务器不会连接到所有用户,而是仅连接到有限数量的用户,然后这些用户将通过 webrtc 将数据分发到 p2p 网络。这是明智的吗?最简单的实现方法是什么?

该信息不是私密的,几秒 <5 秒的延迟是可以接受的。

4

3 回答 3

18

是的,这就是 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

  1. 客户端连接到您的服务器并下载必要的文件 (http)(我的意思是网页、脚本和 css,而不是您要共享的文件。)
  2. 客户端请求一个新会话。(ws)
  3. 服务器在对象内创建会话实例。

    var sessID = Math.random().toString(36).substring(12, 16);
    会话[sessID] = {};

  4. 您将此会话 ID 发送给客户端 (ws),以便它可以将其发送给其他人(使用邮件等)。另一个用户连接到服务器(http)(ws),但不请求 ID,它发送它。

  5. 当服务器接收到这个消息时,它会向第一个客户端和这个客户端发送一条消息,其中包含双方都准备好的消息。发送客户端创建一个新的 webRTC 对象,并创建一个新的报价(它将这个报价存储在 dc.setLocalOffer(sdp) 中)。它将它发送到服务器(ws),服务器将它发送到客户端 2(ws)。现在客户端使用 存储它dc.setRemoteDescription(sdp),并创建一个答案。( dc.createAnswer()), 设置这个答案( dc.setLocalDescription(sdp)。这个答案被发送给客户端一。现在你可以使用数据通道了。

我不知道数据通道是如何工作的,因为我只使用过PeerConnection,这尤其适用于音频和视频流。您可以使用它来了解如何建立连接。代码在我的 repo中。里面还有很多代码,因为这是一个“profielwerkstuk”(学校的一些工件,我和朋友一起做的)。你感兴趣的东西是 server.js(这是 nodejs 服务器,用于交换 sdp 和 ICE 候选者)。该网页位于 htdocs/mp.html 中(不是很有趣),用于执行此操作的一段 javascript 代码位于htdocs/scripts/rtc.js中。

有关更多信息,您可能希望查看此示例以及此处的说明

已经有了“你想要的东西”,它使用了大量的代码来实现这一点。另请注意,stackoverflow 是提出问题,而不是要求现成的代码。如果您想这样做,请查看 carreers 2.0,并找到愿意为您执行此操作的人。

编辑2:现在我看到了你的答案,我认为最好的方法是将所有连接存储在会话对象内的数组中,然后连接客户端 1 -> 2、2-> 3、3-> 4 等.但是那么你有零件等问题。想想洪流,你可以连接到多个人并从每个人下载小部分。这真的很难,是的,而且我认为没有人已经做了这么大的事情(除了 sharefest)。如果你真的想做到这一点,你需要自己做最多的事情。花一些时间考虑如何解决这个问题,并使用 stackoverflow(或其他信息站点)来寻找如何设置 rtc 等。

于 2014-01-13T23:47:59.063 回答
4

完全明智。

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/

于 2013-11-17T16:55:01.917 回答
-2

是的,这非常明智,WEBRTC 是实时通信的下一个重要因素!让它如此明智的原因是它是用 Javascript 完成的。随着时间的推移,它正在以数百万的速度增长,并在更多平台上得到支持。它的低成本和高品质!

我不是来抨击你或任何事情的,但 webrtc 随时都会将 Node 从水中吹走。

选择 webrtc,你知道你想要;)

于 2013-11-16T06:01:38.860 回答