长轮询还是全双工连接?捕获量在哪里?

时间:2015-10-10 16:27:17

标签: javascript php ajax long-polling ajax-polling

我正在实施一个带有长轮询的邮件系统,以便为我的用户提供实时更新。 这样做我注意到一些网站如Hotmail也使用了xhr请求,但它们似乎与我实现的有点不同。

正如您在图片中看到的,在我的实现中,客户端发出请求,服务器保留请求,直到有新的数据更新可用。然后发送回有效负载并关闭连接。收到后,javascript会向Web服务器发送新请求。

Hotmail会在保持连接打开的同时发回请求。这怎么可能??我怎么能自己实现呢?最重要的是,差异是什么?

谢谢。

Long-poll

3 个答案:

答案 0 :(得分:1)

有两种最常见的双向HTTP机制,请参阅RFC6202 "Known Issues and Best Practices for the Use of Long Polling and Streaming in Bidirectional HTTP"

  
      
  • HTTP长轮询:服务器尝试“保持打开”(不是     立即回复)每个HTTP请求,仅在响应时     有事件要传递。这样,总有一个     服务器可以为此目的回复的待处理请求     在事件发生时传递事件,从而最大限度地减少延迟     消息传递。

  •   
  • HTTP Streaming:服务器无限期地保持请求打开;那     是的,它永远不会终止请求或关闭连接     在将数据推送到客户端之后。

  •   

您还可以在RFC6202中找到这些方法的详细问题列表。每种方法都有其优点和缺点。

因此,在HTTP流式传输期间,连接不会终止:

  

使用HTTP流的应用程序的基本生命周期如下:

     
      
  1. 客户端发出初始请求,然后等待      响应。

  2.   
  3. 服务器将响应推迟到轮询请求,直到更新为止      可用,或直到特定状态或超时      发生。

  4.   
  5. 每当有可用的更新时,服务器都会将其发送回      客户作为回应的一部分。

  6.   
  7. 服务器发送的数据不会终止请求或      连接。服务器返回步骤3.

  8.   

答案 1 :(得分:1)

我认为可能有一种比使用长轮询更好的方法。您可以实现WebSocket连接。然后,您可以与服务器建立持久的双向连接。 WebSocket是一种基于HTTP的升级协议,旨在避免像长时间轮询这样的解决方法。 如果你想阅读更详细的内容:

https://tools.ietf.org/html/rfc6455

http://www.html5rocks.com/en/tutorials/websockets/basics/

如果你想支持那些无法建立WebSockets的旧浏览器,你可以使用像Dojox / Socket这样的东西来自动使用长轮询作为后备。

http://dojotoolkit.org/api/1.10/dojox/socket.html

https://www.sitepen.com/blog/2012/11/05/dojo-websocket-with-amd/

答案 2 :(得分:1)

Hotmail使用网络套接字。 Web套接字请求与http请求的不同之处在于,当用户在网站上时,Web套接字连接始终是持久的。因此,沟通很快就会发生这样的情况:用户第一次打开您的网站时,他会向您的服务器发送http请求。由于http协议位于OSI Model的第7层,因此请求通过TCP层并与服务器建立套接字连接(位于OSI模型的第5层)。使用适当的服务器端Web套接字技术,服务器可以使用此持久套接字与客户端连接,以便在需要时推送数据。

根据您使用的后端语言,您可以使用多种不同的技术/库来实现Web套接字。对于asp.net Web应用程序,您可以使用Microsoft's SignalR。如果你使用javscript(Node.js)作为你的后端,你可以使用Socket.io。请注意,即使您没有将node.js用于后端,也可以使用Socket.io,但实现不会变得微不足道,因为您现在有2个不同的服务器可能需要共享数据(例如:会议或数据库)。

Node.js和SignalR的优点在于它们非常高性能且可扩展到许多用户,尤其是Node.js.这两种技术的另一个重要特点是,如果客户端的浏览器不支持Web套接字,则它们具有适当的回退方法,如服务器发送事件,Ajax轮询,Ajax长轮询,隐藏iframe元素...... < / p>

如需进一步阅读,我建议使用此Stackoverflow question