我该如何建立一个浏览器到浏览器(点对点)的连接?

93
我如何使用HTML5、CSS和JavaScript编写客户端网站,以便在页面加载后允许客户端浏览器之间进行直接TCP/IP连接?
我需要做到这一点以减少延迟,因为该网站将要求尽快将一个用户的输入传输给另一个用户,因此从客户端A向服务器再向客户端B发送数据不是一个好选择。
我读了以前关于这个问题的帖子,但我找不到可用的工作解决方案/示例。从我所读的内容来看,客户端之间的直接连接可以通过插件(如Silverlight、Java或Flash)实现。
是否有任何不需要插件的解决方案?我想只使用JavaScript。

3
WebRTC点对点连接无需信令服务器:http://blog.printf.net/articles/2013/05/17/webrtc-without-a-signaling-server/本文介绍了如何在WebRTC应用程序中实现点对点连接,而无需使用信令服务器。这是通过直接在两个对等端之间进行SDP协商来实现的。作者提供了一些示例代码和指导,以帮助读者实现此功能。 - danijar
1
还可以看看PeerJS,这是在这个领域有些影响力的项目,它具有相对不错的浏览器支持 - Boaz
1
最简单的方法是使用http://httprelay.io和AJAX调用。它很快,少于50毫秒。 - Jonas
3个回答

138

在Stackoverflow上有几个关于浏览器P2P连接的主题:

  1. HTML5是否允许Web应用程序进行点对点HTTP连接?
  2. 有哪些技术可用于在浏览器中进行P2P?
  3. HTML5是否支持点对点(而不仅仅是WebSockets)?
  4. HTML5 Websockets能否直接连接两个客户端(浏览器),而不使用服务器(P2P)?
  5. 是否可能在Web浏览器中创建点对点连接?
  6. Websockets是否允许进行P2P(浏览器到浏览器)通信?
  7. HTML 5点对点视频的可能性?
  8. WebRTC已经在任何浏览器中实现了吗?

正如大多数主题中所提到的那样,2008年的HTML5工作草案都有一个名为“点对点连接”的部分:

自从2009年2月12日W3C工作草案发布以来,“点对点连接”一节已经消失。但是这种P2P连接并没有消失,它以WebRTC(实时通信)规范中的PeerConnection的名称重新出现: 自2011年10月31日起,W3C编辑草案已成为官方工作草案:

PeerConnection的唯一实现(基于UDP)存在于Ericsson实验室修改的WebKit中(2011年5月),其工作效果相当不错。现在有一些补丁已经在WebKit中(2011年10月-请参见下面的更新!):

此外,WebRTC倡议是由Google、Mozilla和Opera共同推进的项目。因此,他们正在继续关于PeerConnection的规范:

可能Chrome(使用WebKit)将是第一个支持PeerConnection的主要浏览器,从而支持WebRTC:

自2012年1月18日起,Chrome也支持WebRTC。在Dev频道(Windows、OSX、Linux)和金丝雀版(Windows和OSX)中,可以通过chrome://flags下启用它来使用它。它仅支持像视频和音频这样的MediaStream,可以通过多个演示进行测试。目前不支持传输应用程序数据,如String/ArrayBuffer/...。
2012年3月16日,WebRTC编辑草案将一个"点对点数据API"分离出来以发送和接收通用应用程序数据(StringArrayBufferBlob)。Chromium希望尽快实现Data API(2012年4月10日)。

4月3日,Mozilla也发布了Firefox的WebRTC的第一个工作示例。

DataChannel计划在Chrome的25版本中推出,但需要使用标志开启。与此同时,可以在Firefox Nightly / Aurora(2012年12月12日)中进行测试:

2018年:DataChannels仍处于实验阶段,但可以在当前版本的Chrome和Firefox中使用:


12
这里是2014年,你能否更新你的博客以反映最近的进展? - myroslav
1
@myroslav http://www.webrtc.org/interop 是一个很好的起点。现在Firefox、Chrome和Opera都提供了完整的支持,并且可以通过适当的适配器进行互操作。 - msemelman
2
在澳大利亚,现在是2016年。我们能否获取浏览器点对点的最新链接? - Ganesh Krishnan
2
那个更新怎么样? - obskyr
1
截至2017年,WebRTC已成为大多数现代浏览器的标准组成部分。请参见https://dev59.com/pnNA5IYBdhLWcg3wQ7e4#45765379 - Beejor
显示剩余4条评论

5

很抱歉,目前仅使用JavaScript无法实现。Websockets(和Socket.IO)允许客户端和服务器之间建立类似套接字的连接,但不允许客户端之间建立连接。您的选择是使用插件 - 不管是Flash、Silverlight、Java还是自定义。

您可以使用socket.io并编写简单的代理服务器来模拟此功能。


你确定WebSocket不允许两个浏览器之间的直接点对点通信吗?根据维基百科上的说法,它似乎可以:“WebSocket是一种技术,提供双向全双工通信通道,通过单个传输控制协议(TCP)套接字。它被设计用于在Web浏览器和Web服务器中实现,但任何客户端或服务器应用程序都可以使用它。” - Răzvan Flavius Panda
6
问题是,浏览器无法监听或充当服务器。 您可以与任何服务器进行全双工通信,但您的客户端无法成为服务器。 另外,即使您能够这样做,也会遇到无数防火墙问题。 Emil的解决方案会更好,尽管速度较慢。 - hayesgm
从技术上讲,WebSockets 可以在任何地方使用。但是在浏览器中,由于安全限制,这是不可能的。ghayes 已经解释了这一点。此外,请注意,这种解决方案可能会更快,因为通常服务器放置在带宽容量巨大的地方,所以您的服务器可以很好地处理 100 个客户端,而使用真正的 p2p,您将很快使用户连接饱和。 - Emil Ivanov
@Emil Ivanov:你说的是对的,但如果只是1对1的连接,速度应该会更快。 - Răzvan Flavius Panda

4
我想提醒您,现在大多数用户都处于NAT或防火墙后面,这意味着您不能轻松地建立与用户计算机的传入连接。因此,如果可能的话,您的想法只能在某些情况下起作用,并且会给您的解决方案带来额外的复杂性。因此,使用可能具有持久连接的客户端-服务器系统(使用WebSockets或Socket.io)是更好的选择。

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