其他人提供了很多全面的答案,这里再补充一些。
WebSockets唯一的优势是与Java Applets、Flash或Silverlight等插件相比,WebSockets内置于浏览器中,不依赖插件。
如果你的意思是可以使用Java Applets、Flash或Silverlight来建立套接字连接,那么是可以的。但由于各种限制,你不会在现实世界中经常看到这种部署。
例如,中间人可以关闭这种流量。WebSocket标准旨在与现有的HTTP基础架构兼容,因此不太容易被防火墙和代理干扰。
此外,WebSocket可以使用端口80和443,而无需专用端口,这得益于协议设计的尽可能与现有的HTTP基础架构兼容。
那些套接字替代方案(Java、Flash和Silverlight)在跨域体系结构中使用时难以确保安全性。因此,人们常常会容忍不安全因素,而不是费力地确保其安全性。
它们还可能需要打开其他“非标准”端口(管理员不愿意这样做),或需要管理策略文件。
简而言之,使用Java、Flash或Silverlight进行套接字连接在实际架构中存在问题,因此你很少看到它们被广泛部署。Flash和Java可能已经具备了这种能力至少10年,但并不普遍。
WebSocket标准是从新的角度出发,并考虑到这些限制,希望能够从中吸取一些教训。
一些WebSocket实现在无法建立WebSocket连接时(例如在旧浏览器中运行或当中间人干扰时),会将Flash(或可能是Silverlight和/或Java)作为回退选择。
虽然对于这些情况有某种后备策略是明智的,甚至是必要的,但大多数使用Flash等的实现都会遭受上述缺点。它们可以通过一些变通方法来实现安全的跨域连接,但大多数实现不会这样做,因为这并不容易。
例如,如果您依赖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和网络中获取的所有信息中获得完美的意义。”
这是一个很棒的问题,答案都非常有信息量!