根据您的问题,我了解到在这种情况下,关于 AJAX 长拉以及服务器与客户端的功能可能存在一些混淆。
让我们从头开始。与 Websocket 连接和一些 HTTP 流技术不同,HTTP 连接在客户端(浏览器)完成数据下载后关闭。
只有客户端(浏览器)可以启动与服务器的网络连接。服务器无法发起连接。
这种安排引发了两个问题:
网络连接关闭后,服务器无法联系客户端并“推送”新数据。
这会导致网络速度变慢,因为网络连接的一项重要功能称为“慢启动”。
AJAX 尝试通过打开新连接和“拉取”数据来解决第一个问题(更新旧数据)。
浏览器每隔一段时间就会创建一个新连接,询问服务器“怎么了?”。如果存在新数据,则服务器以新数据进行应答。否则服务器会回答“没什么新东西”。
将 AJAX 想象成服务器唠叨的妻子。 “循环”是在浏览器上使用 JavaScript 完成的,它是唯一可以打开新连接的浏览器(因此服务器不使用后台进程)。
另一方面,Websockets 和 HTTP/2 通过尝试避免重复的“慢启动”(重复使用相同的连接意味着连接已经运行得更快)来解决网络应用程序性能问题,并且允许服务器“推送”数据(消除过多的流量)。
当您使用 Websockets 时,将新数据推送到客户端是服务器的责任,如果连接丢失,则客户端(浏览器)有责任重新连接到服务器(这可能并且可能通常应该发生以确保网络可操作性)时不时)。
服务器需要跟踪连接并将正确的数据发送到正确的客户端。
这允许以牺牲服务器资源和程序员的工作时间为代价来提高性能和更好地利用网络资源。在我看来,这笔交易非常值得。 Websockets 非常棒,它们与 HTTP/2 一起应该可以帮助我们创造出令人惊叹的东西和卓越的用户体验。
有关客户端(浏览器)使用的不同 JavaScript 代码的示例,您可以阅读 Rony 的答案。