我正在为 1 个频道中的许多用户寻找实时扩展的廉价解决方案。
我正在使用 sockjs,但在谈论非常大的数字时,缩放非常烦人。
我正在考虑使用 webrtc 来降低 p2p 的成本。服务器不会连接到所有用户,而是仅连接到有限数量的用户,然后这些用户将通过 webrtc 将数据分发到 p2p 网络。这是明智的吗?最简单的实现方法是什么?
该信息不是私密的,几秒 <5 秒的延迟是可以接受的。
我正在为 1 个频道中的许多用户寻找实时扩展的廉价解决方案。
我正在使用 sockjs,但在谈论非常大的数字时,缩放非常烦人。
我正在考虑使用 webrtc 来降低 p2p 的成本。服务器不会连接到所有用户,而是仅连接到有限数量的用户,然后这些用户将通过 webrtc 将数据分发到 p2p 网络。这是明智的吗?最简单的实现方法是什么?
该信息不是私密的,几秒 <5 秒的延迟是可以接受的。
是的,这就是 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
,
服务器在对象内创建会话实例。
var sessID = Math.random().toString(36).substring(12, 16);
会话[sessID] = {};
您将此会话 ID 发送给客户端 (ws),以便它可以将其发送给其他人(使用邮件等)。另一个用户连接到服务器(http)(ws),但不请求 ID,它发送它。
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 等。
完全明智。
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/
是的,这非常明智,WEBRTC 是实时通信的下一个重要因素!让它如此明智的原因是它是用 Javascript 完成的。随着时间的推移,它正在以数百万的速度增长,并在更多平台上得到支持。它的低成本和高品质!
我不是来抨击你或任何事情的,但 webrtc 随时都会将 Node 从水中吹走。
选择 webrtc,你知道你想要;)