我可以将 HTML5 WebSockets 用于通常使用 AJAX 完成的任务吗?

Posted

技术标签:

【中文标题】我可以将 HTML5 WebSockets 用于通常使用 AJAX 完成的任务吗?【英文标题】:Can I use HTML5 WebSockets for tasks usually accomplished with AJAX? 【发布时间】:2011-09-21 06:38:31 【问题描述】:

我刚开始研究html5 WebSockets。我想知道我是否可以使用 websockets 而不是使用 ASP.NET UpdatePanels 来更新网页的所有内容,或者这是否有点矫枉过正?

WebSockets 可以用作 AJAX 的替代品吗?这就是 WebSocket 的用途吗?

大多数示例用于双向聊天类演示。但是,如果我想单击一个按钮而不是回发来更新网格,我可以使用 WebSockets 执行此操作吗?这是个好主意吗?

【问题讨论】:

【参考方案1】:

我认为 XHR 和 WebSocket 用于两种不同的场景,您应该使用更适合您的场景的一种。

XHR 具有请求-响应对。每个请求都与一个响应配对。这对于远程过程调用很有用,但如果您想要没有请求的响应(即服务器推送),则会产生不必要的开销。

WebSocket 解决了上述问题。您可以发送请求而不期待任何响应。服务器还可以通过响应向您发送任何内容,而无需您先发起请求。

在按钮点击和内容更新场景(例如编辑表格单元格)中,XHR(和 UpdatePanel)效果更好。那是因为内容更新必须与单击按钮配对。这是一个请求-响应对。但在纯内容更新场景(例如显示实时股票价格)中,WebSocket 效果更好。在内容更新与按钮点击(例如聊天)无关的场景中,WebSocket 也能更好地工作。

【讨论】:

【参考方案2】:

WebSocket 标准专为需要低延迟、低开销通信的应用程序而设计。它们适用于正在推动 AJAX/Comet/long-poll 可能实现的极限的现有应用程序。但更重要的是,WebSockets 将启用一种全新的、尚不存在的 Web 应用程序。

对于您的情况,听起来 WebSockets 可能有点矫枉过正,因为延迟不是您正在构建的核心问题。您当然可以使用 WebSockets 来做到这一点,但我怀疑在您的情况下,这将是额外的工作而收效甚微。

请参阅this answer,了解 WebSockets 已经准备好用于一般用途的原因(web-socket-js 和原生 ios 支持意味着几乎所有浏览器都支持 WebSockets)。

【讨论】:

在这种情况下使用 WebSockets 的主要问题是,可能需要付出相当多的努力才能获得一点收益。在这种情况下,可能不值得尝试将 WebSocket 支持添加到 IIS(假设 ASP.NET 应用程序在 IIS 上运行)或添加额外的 WebSocket 服务器和基础设施以允许 ASP.NET 应用程序与其通信。由于回退支持,我完全同意 WebSockets 已准备好进行一般使用。问题是在您自己的托管环境的后端设置 WebSocket 支持目前有点痛苦。【参考方案3】:

如果您想在 IE8 应该能够查看的页面中使用 WebSockets,请改用 Ajax。

WebSockets 最初是为客户端和服务器之间的快速双向通信而设计的。让游戏在浏览器中蓬勃发展非常重要,但服务器端的实现还没有完全标准化——可能会有进一步的安全问题。

目前,WebSockets 仅用于玩具实现。他们还没有为客户做好准备。此外,只有当 Ajax 调用 Comet 调用速度太慢而无法满足您的需求时,它们才真正需要。

【讨论】:

通过将web-socket-js(基于Flash 的polyfill/fallback)添加到您的应用程序中,您可以支持任何带有Flash 的浏览器。结合 iOS 本身支持 WebSockets 的事实,这使得 WebSockets 在几乎所有主流浏览器上都可用。有许多 WebSockets 服务器,大多数都支持浏览器中的所有协议版本。此外,“玩具”具有误导性。虽然大多数 WebSockets 使用相对较新并且处于开发阶段,但它的应用程序肯定是生产质量的。【参考方案4】:

从技术上讲,是的。实际上,我可能会等待。

Websockets 绝对是 HTML5 进行我们习惯的通信类型的方式。从技术上讲,是的,您可以,但根据您正在构建的网站类型,您可能需要推迟。 Websockets 是 HTML5 规范中较新的部分之一,并且仍在最终确定中。它适用于最新版本的 Chrome 和 Firefox 4,但 IE9 尚未实现此功能,也没有关于 IE10 是否会支持它的消息。展示最新技术的技术网站(例如演示 HTML5 中的可能性)以及任何其他可以保证绝大多数观众使用支持浏览器或早期采用者的东西应该没问题。如果没有,您可能会疏远一些用户。只有你可以决定走哪条路。

这里的关键是 Websockets 目前是一个不断变化的规范,而 AJAX 在新旧浏览器中都可以使用。如果除了保证规范和浏览器明天不会更改并破坏现有代码之外,您还希望向后兼容,请使用 AJAX。如果您对规范和浏览器实现在未来可能会发生变化并且不关心人们使用旧浏览器的可能性很小,那么请使用 websockets。

Another *** answer shows websocket support:

Chrome 4.0 支持 Websocket。 Safari 5.0.2 也支持它们 Firefox 4.0 附带禁用 WebSockets 支持。让它看到 Opera 11 附带禁用支持以重新启用它,请参阅 IE9 不支持它们,但附加组件提供实验性支持

【讨论】:

WebSocket API(它是一个独立于协议本身的标准,在技术上也不是 HTML5 的一部分)不太可能以向后不兼容的方式改变。 WebSocket 协议允许编写支持多个协议版本的服务器,并且大多数都支持。 iOS 现在原生支持 WebSockets。此外,web-socket-js 是基于 Flash 的 polyfill/fallback。这意味着浏览器支持几乎已经普及。

以上是关于我可以将 HTML5 WebSockets 用于通常使用 AJAX 完成的任务吗?的主要内容,如果未能解决你的问题,请参考以下文章

我可以将 html5 Websockets 与 Windows 域身份验证一起使用吗?

用于asp.net MVC聊天应用程序的signalR vs html5 websockets

用于多个主题的 Spring WebSockets

HTML5 WebSockets 不工作。服务器=ColdFusion,客户端=Delphi

是否有 HTML5 WebSockets 的 Java 小程序实现?

HTML5 Websockets 服务器要求