Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 长轮询还是全双工连接?陷阱在哪里?_Javascript_Php_Ajax_Long Polling_Ajax Polling - Fatal编程技术网

Javascript 长轮询还是全双工连接?陷阱在哪里?

Javascript 长轮询还是全双工连接?陷阱在哪里?,javascript,php,ajax,long-polling,ajax-polling,Javascript,Php,Ajax,Long Polling,Ajax Polling,我正在实现一个带有长轮询的消息传递系统,以便为我的用户提供实时更新。 这样做时,我注意到一些网站,如Hotmail,也使用xhr请求,但它们似乎与我实现的有点不同 如图所示,在我的实现中,客户机发出请求,服务器保留请求,直到有新的数据更新可用。然后发送回有效负载并关闭连接。一旦收到,javascript将向web服务器发送一个新请求 Hotmail在保持连接打开的同时将请求发回。这怎么可能??我自己如何实现这一点?最重要的是,有什么区别 多谢各位 有两种最常见的双向HTTP机制,请参阅: HT

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

如图所示,在我的实现中,客户机发出请求,服务器保留请求,直到有新的数据更新可用。然后发送回有效负载并关闭连接。一旦收到,javascript将向web服务器发送一个新请求

Hotmail在保持连接打开的同时将请求发回。这怎么可能??我自己如何实现这一点?最重要的是,有什么区别

多谢各位


有两种最常见的双向HTTP机制,请参阅:

  • HTTP长轮询:服务器尝试“保持打开”(未关闭) 立即回复)每个HTTP请求,仅在 有很多事情要做。这样,总有一个 服务器可以响应的挂起请求,以便 在事件发生时交付事件,从而最大限度地减少延迟 消息传递

  • HTTP流:服务器无限期地打开一个请求;那个 它从不终止请求或关闭连接,甚至 将数据推送到客户端之后

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

因此,在HTTP流化期间,连接不会终止:

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

  • 客户端发出初始请求,然后等待响应 答复

  • 服务器延迟对轮询请求的响应,直到更新 可用,或直到特定状态或超时结束 发生了

  • 只要更新可用,服务器就会将其发送回服务器 客户端作为响应的一部分

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


  • 我认为可能有一种比使用长轮询更好的方法。您可以实现WebSocket连接。然后,您就可以与服务器建立持久的双向连接。WebSocket是一种基于HTTP的升级协议,其构建目的是避免“某种解决方法”——长轮询之类的技巧。 如果您想更详细地了解这一点:

    为了防止您想要支持不能建立WebSocket的旧浏览器,您可以使用类似Dojox/Socket的东西,自动使用长轮询作为回退


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

    根据后端使用的语言,可以使用几种不同的技术/库来实现web套接字。对于asp.net web应用程序,您可以使用。如果您对后端使用javscript(Node.js),那么您就无法使用它。请注意,即使您的后端没有使用node.js,您也可以使用Socket.io,但实现不会那么简单,因为您现在将有两个可能需要共享数据的不同服务器(例如:会话或数据库)

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


    为了进一步阅读,我推荐这个

    我选择这个,因为它主要解决了我的问题。我正在实现的是一个聊天信息系统。到目前为止,漫长的投票过程非常顺利。但这让我想出了一个更好的主意。实时“打字”将向用户显示其他人是否正在打字。因此,我认为web套接字是更好的解决方案。我说的对吗?是的,web套接字是解决您的问题的最佳方案。事实上,去年我为我的一个大学项目实现了类似skype的web应用程序。基本上,它是php/mysql网站,提供所有基本功能,如呈现网站和访问数据库,但我还实现了node.js服务器,它使用socket.io进行实时更新。基本上,我拥有的是一个具有实时消息和键入功能的聊天室,但我也更进一步,实现了WebRTC,从而实现了点对点音频/视频通信。如果你愿意,我可以在github上传这个项目。太棒了!非常感谢。目前我更喜欢facebook风格的现场聊天,因为这会给我的项目增加太多的开销。。不过,表情符号会有所帮助。