是否可以创建一个 web 应用程序,通过中央服务器的帮助,与同一 web 应用程序的其他用户创建直接连接?我想象的过程类似于UDP打洞。
我已经阅读了 HTML5 中的新 WebSockets API,但似乎必须使用 WS 兼容服务器来初始化连接,才能开始完全双向的连接。我更关注的是一种在客户端之间建立直接连接的过程,而服务器仅在初始握手时介入。
注意:Java applets 不算。我只对标准浏览器技术感兴趣。
是否可以创建一个 web 应用程序,通过中央服务器的帮助,与同一 web 应用程序的其他用户创建直接连接?我想象的过程类似于UDP打洞。
我已经阅读了 HTML5 中的新 WebSockets API,但似乎必须使用 WS 兼容服务器来初始化连接,才能开始完全双向的连接。我更关注的是一种在客户端之间建立直接连接的过程,而服务器仅在初始握手时介入。
注意:Java applets 不算。我只对标准浏览器技术感兴趣。
不是基于猜测,这里有一个知情的答案:
HTML5计划允许使用JavaScript进行点对点连接,但这些连接将不是原始的TCP连接。
完整的规范可以在http://dev.w3.org/html5/websockets/找到。
编辑:关于点对点连接,请查看以下链接:
重要的是要注意,功能仍在协商中。能够创建“本地聊天”Web应用程序将是很好的。
jrh
更新于10/17/2012: 此功能现在已在Chrome Stable v22中存在。为了在Chrome中使用此功能,必须在chrome://flags中启用两个标志:
然后,您可以访问AppRTC演示页面来尝试演示。有关设置Chrome以使用点对点功能和启用设备捕获的更详细说明,请参见WebRTC - 运行演示文稿页面。
更新: Ericcson Labs的工程师们在WebKit构建中提供了一个概念验证,HTML5点对点对话视频。
他们在博客中展示了这项技术的演示,以及有关该技术如何工作的图表和解释。
他们正在努力稳定该技术并将其提交到WebKit存储库中。
截至本文撰写时(2017年),WebRTC现在成为大多数现代浏览器的标准部分(使用率约为70%),并允许进行多媒体流、点对点和打洞。
有关WebRTC的文档、示例代码和实时示例可在html5rocks.com找到。
根据caniuse.com和html5rocks.com,以下浏览器支持WebRTC:
完全支持:Edge 14,Firefox 22,Firefox Android 55
部分支持:Android Browser 56,Chrome 20,Chrome Android 29,Edge 12,Firefox 17,Opera 18,Opera Android 20,Opera Mobile 12,UC Browser Android 11.4
未来支持(2017年第3季度):Chrome for iOS 11,Safari 11 for iOS 11 and OS X 10.11
不支持:IE,IE Mobile,Opera Mini
WebRTC在苹果设备上的饱和率受限,因为Safari 11尚未发布,并且需要iOS 11或OS X 10.11。但根据过去的升级趋势,到2018年,WebRTC应该在大约75%的iOS设备上可用,并在2020年达到100%。
这将是非常棘手的问题,原因如下:
WebSockets旨在解决第二个问题,但(我预计是故意的)不解决其他两个问题。当HTML5规范中谈到点对点(peer-to-peer)时,他们谈论的是服务器和客户端之间的全双工通信,而不是一个客户端和另一个客户端之间的通信。
然而,在WebSocket上实现适当的网络堆栈很简单,但前提是所有通信仍然必须通过服务器进行。我曾经见过使用长轮询(我在大学时的一个朋友编写了一个完整的TCP/IP堆栈)来完成这项工作。
Web Sockets 的整个理念是为了解决防火墙和代理的问题 http://www.kaazing.org/confluence/display/KAAZING/What+is+an+HTML+5+WebSocket
我赞同 harshath.jr 的观点:你可以很好地将服务器作为目录(公开每个连接代理的“起源”;起源是指如 draft-abarth-origin 中的方案+主机+端口,其中方案可以是“ws”或“wss”)。然后,您可以启动点对点 WebSocket 连接;通过 CORS 工作的 SOP。当然,这意味着每个代理(即浏览器)都必须嵌入自己的 WebSocket 服务器(类似于 Opera Unite)。
同时,可以使用 XMPP/IRC 等方式:没有点对点连接,而是使用 WebSocket 连接到中央服务器(或网络!)以将消息传递给已连接的代理(最终使用某些特定的 WebSocket“子协议”)
编辑:请注意,所有这些实际上都超出了 HTML5 的范围(所有这些东西曾经是 HTML5 的一部分,但已被拆分成它们自己的规范)