Javascript WebSocket是如何实现的? WebSocket是如何实现的 这项新技术背后的算法是什么(与长轮询相比) 就性能而言,它们如何能比长期轮询更好

Javascript WebSocket是如何实现的? WebSocket是如何实现的 这项新技术背后的算法是什么(与长轮询相比) 就性能而言,它们如何能比长期轮询更好,javascript,websocket,Javascript,Websocket,我问这些问题是因为 如果我们等待的时间足够长,就会发生超时,导致 客户端上的以下消息 这无疑是我在使用长轮询时面临的问题。它会停止进程以防止服务器过载,不是吗?关于web套接字、长轮询和其他方法的非常好的解释: 长轮询-请求→ 等待→ 答复。像AJAX一样创建到服务器的连接,但保持活动连接打开一段时间(虽然不长),在连接期间,打开的客户端可以从服务器接收数据。由于超时或数据eof,客户端必须在连接关闭后定期重新连接。在服务器端,它仍然被视为HTTP请求,与AJAX相同,只是请求时的应答将在现在

我问这些问题是因为

如果我们等待的时间足够长,就会发生超时,导致 客户端上的以下消息


这无疑是我在使用长轮询时面临的问题。它会停止进程以防止服务器过载,不是吗?

关于web套接字、长轮询和其他方法的非常好的解释:

长轮询-请求→ 等待→ 答复。像AJAX一样创建到服务器的连接,但保持活动连接打开一段时间(虽然不长),在连接期间,打开的客户端可以从服务器接收数据。由于超时或数据eof,客户端必须在连接关闭后定期重新连接。在服务器端,它仍然被视为HTTP请求,与AJAX相同,只是请求时的应答将在现在或应用程序逻辑定义的未来某个时间发生。在所有主要浏览器中都支持

WebSocket-客户端↔ 服务器。创建到服务器的TCP连接,并根据需要保持该连接。服务器或客户端可以轻松关闭它。客户端通过HTTP兼容的握手过程,若成功,则服务器和客户端可以随时双向交换数据。如果应用程序需要以两种方式频繁地交换数据,那么它将非常有效。WebSocket确实有数据框架,其中包括对从客户端发送到服务器的每条消息的屏蔽,因此数据只需加密。支持图(非常好)

总的来说,套接字的性能比长轮询好得多,您应该使用它们而不是长轮询

WebSocket是如何实现的

WebSocket的实现如下所示:

  • 客户端向服务器发出HTTP请求,请求上带有“升级”头
  • 如果服务器同意升级,那么客户端和服务器将交换一些安全凭据,并且现有TCP套接字上的协议将从HTTP切换到webSocket
  • 现在有一个持久的开放TCP套接字连接客户端和服务器
  • 任何一方都可以随时在此打开的套接字上发送数据
  • 所有数据必须以非常特定的webSocket数据包格式发送
  • 因为只要双方同意,套接字就会保持打开状态,这就为服务器提供了一个渠道,每当有新的消息要发送时,就可以“推送”信息到客户端。这通常比使用客户端驱动的Ajax调用要高效得多,在Ajax调用中,客户端必须定期轮询新信息。而且,如果客户端需要向服务器发送大量消息(可能类似于多人游戏),那么使用已经打开的套接字向服务器发送快速消息也比Ajax调用更有效

    由于WebSocket的启动方式(从HTTP请求开始,然后重新调整该套接字的用途),它们与现有web基础设施100%兼容,甚至可以在与现有web请求相同的端口(例如端口80或443)上运行。这使得跨源安全更加简单,并使客户端或服务器端基础设施上的任何人都不必修改任何基础设施以支持webSocket连接

    这项新技术背后的算法是什么 长时间投票

    本文对webSocket连接算法和webSocket数据格式的工作原理进行了很好的总结:

    就性能而言,它们如何能比长期轮询更好

    就其本质而言,长时间投票有点麻烦。它之所以被发明,是因为没有更好的替代方案可以将服务器启动的数据发送到客户端。以下是步骤:

  • 客户端对来自客户端的新数据发出http请求
  • 如果服务器有一些新数据,它会立即返回这些数据,然后客户机发出另一个http请求,请求更多数据。如果服务器没有新数据,那么它只会在连接上挂起一段时间而不提供响应,从而使请求挂起(套接字打开,客户端正在等待响应)
  • 如果在请求仍然挂起的任何时候,服务器获取一些数据,那么它会将这些数据形成一个响应,并为挂起的请求返回一个响应
  • 如果有一段时间没有数据进来,那么最终请求将超时。此时,客户机将意识到没有返回新数据,它将启动一个新请求
  • 冲洗,起泡,重复。返回的每一条数据或挂起请求的每一个超时之后都会有来自客户端的另一个ajax请求
  • 因此,虽然webSocket使用一个长期存在的套接字,客户机或服务器都可以通过该套接字向另一个套接字发送数据,但长期轮询包括客户机一遍又一遍地问服务器“您还有我的数据吗?”每个都有一个新的http请求

    长轮询在正确的情况下可以工作,只是在服务器基础设施、带宽使用、移动电池寿命等方面效率不高

    我想要的是对此的解释:WebSocket保持 C/S之间的开放连接与长轮询等待不同 过程换句话说,为什么WebSocket不会使服务器过载

    维护客户端和服务器之间的开放webSocket连接对于服务器来说是一件非常便宜的事情(它只是一个TCP套接字)。非活动但开放的TCP套接字不需要服务器CPU,只需要非常少量的内存来跟踪套接字。正确配置的服务器一次可以容纳数十万个打开的套接字

    另一方面,进行长时间轮询的客户端,即使没有新信息发送给它,也必须定期重新建立连接。每次它重新建立一个新的连接时,都会有一个TC