其他人的一些很好的答案涵盖了很多领域。这里有一点额外的。
与 Java Applets、Flash 或 Silverlight 等插件相比,WebSockets 的唯一优势是 WebSockets 原生内置于浏览器中,不依赖于插件。
如果您的意思是您可以使用 Java Applet、Flash 或 Silverlight 来建立套接字连接,那么是的,这是可能的。但是,由于限制,您不会经常看到它在现实世界中部署。
例如,中介可以并且确实关闭了该流量。WebSocket 标准旨在与现有的 HTTP 基础设施兼容,因此不太容易受到防火墙和代理等中介的干扰。
此外,WebSocket 无需专用端口即可使用端口 80 和 443,这再次归功于协议设计尽可能与现有 HTTP 基础设施兼容。
这些套接字替代方案(Java、Flash 和 Silverlight)很难在跨域架构中安全使用。因此,经常尝试跨域使用它们的人们会容忍不安全感,而不是努力安全地做到这一点。
他们还可能需要打开额外的“非标准”端口(管理员不愿意这样做)或需要管理的策略文件。
简而言之,使用 Java、Flash 或 Silverlight 进行套接字连接存在很多问题,以至于您不会经常看到它部署在严肃的体系结构中。Flash 和 Java 拥有这种能力可能至少有 10 年了,但它并不普遍。
WebSocket 标准能够以一种新的方法开始,牢记这些限制,并希望从中吸取一些教训。
当无法建立 WebSocket 连接时(例如在旧浏览器中运行或中介干扰时),一些 WebSocket 实现使用 Flash(或者可能是 Silverlight 和/或 Java)作为它们的后备。
虽然针对这些情况的某种后备策略是明智的,甚至是必要的,但大多数使用 Flash 等的人都会遭受上述缺点的困扰。不一定要那样——有一些变通方法可以使用 Flash、Silverlight 等实现安全的跨域连接——但大多数实现不会这样做,因为这并不容易。
例如,如果您依赖 WebSocket 进行跨域连接,那将可以正常工作。但是,如果您随后在旧浏览器或受干扰的防火墙/代理中运行并依赖 Flash,例如,作为您的后备,您会发现很难进行相同的跨域连接。当然,除非您不关心安全性。
这意味着很难拥有适用于本地和非本地连接的单一统一架构,除非您准备投入大量工作或使用做得很好的框架。在理想的架构中,您不会注意到连接是否是本机的。您的安全设置在这两种情况下都可以使用;您的集群设置仍然有效;您的容量规划仍然有效;等等。
WebSockets 相对于 http 流的唯一优势是您不必努力“理解”和解析接收到的数据。
这不像打开一个 HTTP 流并在您的数据流中等待几分钟、几小时或更长时间那样简单。不同的客户行为不同,您必须对其进行管理。例如,一些客户端会缓冲数据,直到达到某个阈值才将其释放给应用程序。更糟糕的是,有些在连接关闭之前不会将数据传递给应用程序。
因此,如果您要向客户端发送多条消息,例如,客户端应用程序可能在收到 50 条消息的数据之前不会接收数据。这不是太实时。
虽然当 WebSocket 不可用时 HTTP 流式传输可能是一个可行的替代方案,但它不是万能药。它需要很好的理解才能在现实世界条件下的 Web 荒地中以稳健的方式工作。
我还缺少其他任何重大差异吗?
还有一件事还没有人提到,所以我会提出来。
WebSocket 协议被设计为高级协议的传输层。虽然您可以直接通过 WebSocket 连接发送 JSON 消息或其他什么,但它也可以携带标准或自定义协议。
例如,您可以通过 WebSocket 执行 AMQP 或 XMPP,就像人们已经完成的那样。因此,客户端可以从 AMQP 代理接收消息,就好像它直接连接到代理本身(在某些情况下确实如此)。
或者,如果您有一个带有一些自定义协议的现有服务器,您可以通过 WebSocket 传输它,从而将该后端服务器扩展到 Web。通常,已锁定在企业中的现有应用程序可以使用 WebSocket 扩大其范围,而无需更改任何后端基础架构。
(当然,您希望能够安全地完成所有这些操作,因此请咨询供应商或 WebSocket 提供商。)
有些人将 WebSocket 称为 Web 的 TCP。因为就像 TCP 传输更高级别的协议一样,WebSocket 也是如此,但在某种程度上与 Web 基础设施兼容。
因此,虽然总是可以直接通过 WebSocket 发送 JSON(或其他)消息,但还应该考虑现有协议。因为对于很多你想做的事情,可能已经有一个协议已经被考虑过了。
如果我重新询问或将 SO 上的许多问题合并为一个问题,我很抱歉,但我只想从 SO 和网络上关于这些概念的所有信息中完全理解。
这是一个很好的问题,答案都非常丰富!