WebRTC用于实时扩展

Har*_*rry 19 javascript webrtc

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

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

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

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

Mar*_*S95 13

是的,这就是webRTC的用途:在没有服务器的情况下在浏览器之间交换数据.为了完成这项工作,您可能想要在管理连接的服务器上考虑一些管理计划(因为一个客户需要告诉其他客户'嘿,我在这里,连接到我......'),并考虑哪些部分当客户端需要连接到其他人时,数据在哪个客户端上.

作为提示:我在nodejs中使用websockets(和nodejs插件:'ws')在客户端之间进行通信,直到设置了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!
Run Code Online (Sandbox Code Playgroud)

为了交换这个连接数据,我的建议是使用websockets.两个客户端都打开一个websocket,每当一个客户端发送一些东西时,你可以从另一个客户端获取websocket连接(它是一个对象)并发送东西.使用XHR,您只能让浏览器连接,询问数据,如果数据不存在,则在x秒内重试.

总结:使用和设置webRTC进行点对点连接相当容易,但管理谁应该连接谁会遇到很多麻烦.

编辑:我的想法是第一个客户端连接到服务器,并通过XHR或websockets或类似的东西接收它的数据.如果你想要浏览器兼容性,你可能想要使用socket.io,但这并不重要,因为只有chrome和firefox支持webRTC(afaik).然后,您只需从浏览器连接到服务器即可.如果您计划在同一个会话中进行多次交换,则会非常方便,因此您只需与需要下载它的人交换即可.

在服务器端,websockets返回一个"包含"当前连接的对象.因此,如果客户端1将连接,则将其存储在具有我们制作的ID的对象中.如果客户端2连接,您也可以存储它.然后你可以从第一个客户端获取websocket对象并执行.send('your message').

现在我真的会这样做.我将使用(ws)确定websocket的连接,(http)为http请求和(rtc)为webRTC.pc是你的对等连接对象:window.dc = new RTCDataChannel(ICEServers);.sdp意思是SessionDescriptionProtocol,

  1. 客户端连接到您的服务器并下载neccessarry文件(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,尤其是音频和视频流.您可以使用它来了解如何建立连接.这个代码在我的回购中.里面有很多代码,因为这是'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等但是那么你就会遇到零件等问题.考虑一下torrenting,你可以连接到多个人并从每个人那里下载小部件.这真的很难,是的,而且我认为没有人做过这么大的事情(除了sharefest).如果你真的想要做到这一点,你将需要自己做最多的事情.花点时间考虑如何解决这个问题,并使用stackoverflow(或其他信息站点)来寻找如何设置rtc等.