关于网络套接字,长时间轮询和其他方法的很好的解释:
在什么情况下,AJAX长/短轮询优于HTML5 WebSockets?
长轮询 - 要求?等一下 反应。与AJAX一样,创建到服务器的连接,但是保持活动连接打开一段时间(虽然不长),在连接打开期间,客户端可以从服务器接收数据。由于超时或数据中断,客户端必须在连接关闭后定期重新连接。在服务器端,它仍然像HTTP请求一样与AJAX一样对待,只是请求的答案将在应用逻辑定义的现在或将来的某个时间发生。所有主要浏览器均支持。
WebSockets的 - 客户端?服务器。创建与服务器的TCP连接,并保持所需的时间。服务器或客户端可以轻松关闭它。客户端经过HTTP兼容的握手过程,如果成功,则服务器和客户端可以随时双向交换数据。如果应用程序需要两种方式都进行频繁的数据交换,这将非常有效。WebSocket确实具有数据框架,其中包括对从客户端发送到服务器的每条消息的屏蔽,因此可以简单地对数据进行加密。支持图(很好)
总体而言,套接字比长轮询具有更好的性能,您应该使用套接字而不是长轮询。
如何实现Websockets?
webSockets实现如下:
客户端向请求具有"upgrade"标头的服务器发出HTTP请求
如果服务器同意升级,则客户端和服务器交换一些安全凭证,现有TCP套接字上的协议从HTTP切换到webSocket.
现在有一个持久的开放TCP套接字连接客户端和服务器.
任何一方都可以随时在此打开的套接字上发送数据.
所有数据必须以非常特定的webSocket数据包格式发送.
因为只要双方都同意,套接字就会保持打开状态,这就为服务器提供了一个通道,可以在有新内容发送时将信息"推送"到客户端.这通常比使用客户端驱动的Ajax调用更有效,客户端必须定期轮询新信息.并且,如果客户端需要向服务器发送大量消息(可能类似于多玩家游戏),那么使用已经打开的套接字向服务器发送快速消息也比Ajax调用更有效.
由于webSockets的启动方式(从HTTP请求开始然后重新调整该套接字),它们与现有Web基础结构100%兼容,甚至可以在与现有Web请求相同的端口上运行(例如,端口80或443).这使得跨源安全性更加简单,并使客户端或服务器端基础结构上的任何人不必修改任何基础结构以支持webSocket连接.
这项新技术背后的算法是什么(与Long-Polling相比)?
这篇文章中有关于webSocket连接算法和webSocket数据格式如何工作的非常好的总结:编写WebSocket服务器.
在表现方面,他们怎么能比Long-Polling更好?
就其本质而言,长轮询是一种黑客行为.它的发明是因为发送给客户端的服务器启动的数据没有更好的选择.以下是步骤:
客户端从客户端发出新数据的http请求.
如果服务器有一些新数据,它会立即返回该数据,然后客户端发出另一个请求更多数据的http请求.如果服务器没有新数据,那么它只挂起连接一段时间而不提供响应,使请求保持挂起(套接字打开,客户端正在等待响应).
如果在请求仍处于暂挂状态的任何时间,服务器获取一些数据,则它将该数据形成响应并返回待处理请求的响应.
如果暂时没有数据进入,则最终请求将超时.此时,客户端将意识到没有返回新数据,它将启动新请求.
冲洗,起泡,重复.返回的每条数据或待处理请求的每个超时之后都是来自客户端的另一个ajax请求.
因此,虽然webSocket使用一个长期存在的套接字,客户端或服务器可以将数据发送到另一个,但是长轮询包括客户端询问服务器"你还有更多数据吗?" 一遍又一遍,每个都有一个新的http请求.
长时间的轮询工作正确,它在服务器基础设施,带宽使用,移动电池寿命等方面效率不高......
我想要的是对此的解释:Websockets在C/S之间保持开放连接的事实与Long Polling等待过程并不完全相同?换句话说,为什么Websockets不会使服务器过载?
在客户端和服务器之间维护一个开放的webSocket连接是服务器做的一件非常便宜的事情(它只是一个TCP套接字).一个不活动但开放的TCP套接字不占用服务器CPU,只占用很少的内存来跟踪套接字.正确配置的服务器一次可以容纳数十万个开放套接字.
另一方面,进行长轮询的客户端,即使没有新信息发送给它的客户端,也必须定期重新建立它的连接.每次重新建立新连接时,都会有TCP套接字拆除和新连接,然后是要处理的传入HTTP请求.
以下是关于缩放主题的一些有用的参考:
使用Node.js在AWS上进行600k并发websocket连接
Node.js有1M并发连接!
HTML5 WebSocket:Web可扩展性的量子跃进
HTML WebSockets是否为每个客户端维护一个开放的连接?这是否规模?
关于网络套接字,长时间轮询和其他方法的很好的解释:
在什么情况下,AJAX长/短轮询优于HTML5 WebSockets?
长轮询 - 要求?等一下 反应。与AJAX一样,创建到服务器的连接,但是保持活动连接打开一段时间(虽然不长),在连接打开期间,客户端可以从服务器接收数据。由于超时或数据中断,客户端必须在连接关闭后定期重新连接。在服务器端,它仍然像HTTP请求一样与AJAX一样对待,只是请求的答案将在应用逻辑定义的现在或将来的某个时间发生。所有主要浏览器均支持。
WebSockets的 - 客户端?服务器。创建与服务器的TCP连接,并保持所需的时间。服务器或客户端可以轻松关闭它。客户端经过HTTP兼容的握手过程,如果成功,则服务器和客户端可以随时双向交换数据。如果应用程序需要两种方式都进行频繁的数据交换,这将非常有效。WebSocket确实具有数据框架,其中包括对从客户端发送到服务器的每条消息的屏蔽,因此可以简单地对数据进行加密。支持图(很好)
总体而言,套接字比长轮询具有更好的性能,您应该使用套接字而不是长轮询。