其他人的一些很好的答案涵盖了很多方面。还有一些额外的东西。
WebSockets相对于Java Applet,Flash或Silverlight等插件的唯一优势是WebSockets内置于浏览器中,并且不依赖于插件。
如果这表示您可以使用Java Applet,Flash或Silverlight建立套接字连接,那么可以。但是,由于这些限制,您不会看到在现实世界中部署得太频繁。
例如,中介可以并且确实会关闭该流量。WebSocket标准旨在与现有的HTTP基础结构兼容,因此不太容易受到诸如防火墙和代理之类的中介的干扰。
而且,WebSocket可以使用端口80和443,而无需专用端口,这再次要归功于协议设计与现有HTTP基础结构尽可能兼容。
这些套接字替代方案(Java,Flash和Silverlight)很难在跨域体系结构中安全使用。因此,经常尝试跨源使用它们的人会容忍这种不安全感,而不是去努力地安全地做到这一点。
他们还可能需要打开其他“非标准”端口(管理员不愿意这样做)或需要管理的策略文件。
简而言之,使用Java,Flash或Silverlight进行套接字连接很成问题,以至于您不会看到它经常部署在严重的体系结构中。Flash和Java至少有十年拥有此功能,但是并不普遍。
WebSocket标准能够从一种全新的方法开始,牢记这些限制,并希望从中吸取一些教训。
当无法建立WebSocket连接时(例如,在旧的浏览器中运行或中介干扰时),某些WebSocket实现使用Flash(或可能的Silverlight和/或Java)作为后备。
尽管针对这些情况的某种后备策略是明智的,甚至是必要的,但大多数使用Flash等人的策略都会遭受上述缺点的困扰。不一定要这样-有一些变通办法可以使用Flash,Silverlight等实现安全的跨域连接,但是大多数实现不会这样做,因为这并不容易。
例如,如果您依赖WebSocket进行跨域连接,则可以正常工作。但是,如果您随后在旧的浏览器中运行,或者防火墙/代理受到干扰并依赖Flash,例如,作为后备,您将发现很难进行相同的跨域连接。当然,除非您不在乎安全性。
这意味着很难有一个适用于本机和非本机连接的统一体系结构,除非您准备进行大量工作或使用做得很好的框架。在理想的体系结构中,您不会注意到连接是否是本地的。您的安全设置在两种情况下都可以使用;您的群集设置仍然可以使用;您的容量规划将仍然有效;等等。
与HTTP流相比,WebSockets的唯一优势是您不必费力“理解”和解析收到的数据。
这不像打开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和Web上有关这些概念的所有信息中完全理解。
这是一个很好的问题,答案都非常有用!