我正在实施一个带有长轮询的邮件系统,以便为我的用户提供实时更新。 这样做我注意到一些网站如Hotmail也使用了xhr请求,但它们似乎与我实现的有点不同。
正如您在图片中看到的,在我的实现中,客户端发出请求,服务器保留请求,直到有新的数据更新可用。然后发送回有效负载并关闭连接。收到后,javascript会向Web服务器发送新请求。
Hotmail会在保持连接打开的同时发回请求。这怎么可能??我怎么能自己实现呢?最重要的是,差异是什么?
谢谢。
答案 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流的应用程序的基本生命周期如下:
客户端发出初始请求,然后等待 响应。
服务器将响应推迟到轮询请求,直到更新为止 可用,或直到特定状态或超时 发生。
每当有可用的更新时,服务器都会将其发送回 客户作为回应的一部分。
- 醇>
服务器发送的数据不会终止请求或 连接。服务器返回步骤3.
答案 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