简短答案
保持 websocket 处于活动状态对客户端和服务器来说都是有成本的,Ajax 是否只会产生一次成本,这取决于你用它做什么。
长答案
Websockets 经常被误解,因为这整个“嘿,使用 Ajax,就可以了!”。不,Websockets 不能替代 Ajax。它们可以潜在地应用于相同的领域,但在某些情况下使用 Websocket 是荒谬的。
让我们举一个简单的例子:一个动态页面,它在页面加载到客户端后加载数据。很简单,进行 Ajax 调用。我们只需要一个方向,从服务器到客户端。客户端将请求这些数据,服务器将它们发送给客户端,完成。你为什么要为这样的任务实现 websockets?你不需要一直打开你的连接,你不需要客户端不断地询问服务器,你不需要服务器通知客户端。连接将保持打开状态,这将浪费资源,因为要保持连接打开,您需要不断检查它。
现在对于聊天应用程序,情况完全不同了。您需要服务器通知您的客户端,而不是强制客户端每隔 x 秒或毫秒询问服务器是否有新内容。这没有任何意义。
为了更好地理解,将其视为两个人。两者之一是服务器,一个是客户端。Ajax 就像发送一封信。客户端发送一封信,服务器回复另一封信。事实是,对于聊天应用程序,对话将是这样的:
“嘿服务器,有什么东西给我吗?
- 不。
- 嘿服务器,有东西给我吗?
- 不。
- 嘿服务器,有东西给我吗?
-是的,就在这里。”
如果客户端从未请求过答复,则服务器实际上无法向客户端发送一封信。这是对资源的巨大浪费。因为对于每一个Ajax请求,即使被缓存了,也需要在服务器端进行操作。
现在是我之前讨论的使用 Ajax 加载数据的情况。想象一下客户端正在与服务器通话。保持连接处于活动状态是有代价的。它需要电费,您必须向运营商付款。现在,如果您只想让那个人告诉您三个字,为什么还要打电话给某人并让他保持一个小时的电话?发一封该死的信。
总之,Websockets 不是 Ajax 的完全替代品!
有时你会需要Ajax,而 Websocket 的使用是荒谬的。
编辑:SSE 案例
该技术没有被广泛使用,但它可能很有用。顾名思义,服务器发送事件是从服务器到客户端的单向推送。客户端不请求任何东西,服务器只是发送数据。
简而言之:
- 来自客户端的单向:Ajax
- 来自服务器的单向:SSE
- 双向:Websockets