Javascript 长轮询还是全双工连接?陷阱在哪里?
我正在实现一个带有长轮询的消息传递系统,以便为我的用户提供实时更新。 这样做时,我注意到一些网站,如Hotmail,也使用xhr请求,但它们似乎与我实现的有点不同 如图所示,在我的实现中,客户机发出请求,服务器保留请求,直到有新的数据更新可用。然后发送回有效负载并关闭连接。一旦收到,javascript将向web服务器发送一个新请求 Hotmail在保持连接打开的同时将请求发回。这怎么可能??我自己如何实现这一点?最重要的是,有什么区别 多谢各位Javascript 长轮询还是全双工连接?陷阱在哪里?,javascript,php,ajax,long-polling,ajax-polling,Javascript,Php,Ajax,Long Polling,Ajax Polling,我正在实现一个带有长轮询的消息传递系统,以便为我的用户提供实时更新。 这样做时,我注意到一些网站,如Hotmail,也使用xhr请求,但它们似乎与我实现的有点不同 如图所示,在我的实现中,客户机发出请求,服务器保留请求,直到有新的数据更新可用。然后发送回有效负载并关闭连接。一旦收到,javascript将向web服务器发送一个新请求 Hotmail在保持连接打开的同时将请求发回。这怎么可能??我自己如何实现这一点?最重要的是,有什么区别 多谢各位 有两种最常见的双向HTTP机制,请参阅: HT
有两种最常见的双向HTTP机制,请参阅:
- HTTP长轮询:服务器尝试“保持打开”(未关闭) 立即回复)每个HTTP请求,仅在 有很多事情要做。这样,总有一个 服务器可以响应的挂起请求,以便 在事件发生时交付事件,从而最大限度地减少延迟 消息传递
- HTTP流:服务器无限期地打开一个请求;那个 它从不终止请求或关闭连接,甚至 将数据推送到客户端之后
我认为可能有一种比使用长轮询更好的方法。您可以实现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风格的现场聊天,因为这会给我的项目增加太多的开销。。不过,表情符号会有所帮助。