异步servlet长轮询和bayeux协议(Comet)之间的区别

2023-12-29

简单的异步 servlet 和 Comet / Bayeux 协议有什么区别?

我正在尝试实现一种“服务器推送”(或“反向 Ajax”)类型的网页,当服务器上发生事件时,它将从服务器接收更新。因此,即使客户端没有显式发送请求,我也需要服务器能够将响应发送到特定的客户端浏览器。

据我所知,Comet 是此类技术的总称;协议为“Bayeux”。但是当我查看 servlet 规范时,甚至“异步 servlet”似乎也完成了同样的事情。我的意思是我可以定义一个简单的 servlet

<async-supported>

web.xml 中的属性设置为 true;并且该 servlet 将能够异步向客户端发送响应。然后我可以有一个基于 jQuery 或 ExtJS 的 ajax 客户端,它只是不断地执行

long_polling() 

调用 servlet。类似于下面链接中描述的内容http://www.ibm.com/developerworks/web/library/wa-reverseajax1/index.html#long http://www.ibm.com/developerworks/web/library/wa-reverseajax1/index.html#long

所以我的问题是这样的:

简单的异步 servlet 和 Comet / Bayeux 协议有什么区别?

Thanks


确实,“Comet”是这些技术的术语,但贝叶协议仅被少数实现使用。 Comet 技术可以使用它想要的任何协议;巴约就是其中之一。

话虽如此,异步 servlet 解决方案和 Comet+Bayeux 解决方案之间有两个主要区别。

第一个区别是 Comet+Bayeux 解决方案独立于传输 Bayeux 的协议。 在里面CometD http://cometd.org项目中,客户端和服务器都有可承载 Bayeux 的可插拔传输。 您可以使用 HTTP 携带它,Bayeux 是 POST 请求的内容,但您也可以使用 WebSocket 携带它,Bayeux 是 WebSocket 消息的有效负载。 如果您使用异步 servlet,则无法利用 WebSocket,这是更有效率 http://webtide.intalio.com/2011/09/cometd-2-4-0-websocket-benchmarks/比 HTTP。

第二个区别是异步 servlet 仅承载 HTTP,而您需要更多的内容来处理远程 Comet 客户端。

例如,您可能希望唯一地标识客户端,以便同一页面的 2 个选项卡会产生 2 个不同的客户端。为此,您需要向异步 servlet 请求添加一个“属性”,我们称之为sessionId.

接下来,您希望能够对客户端进行身份验证;只有经过身份验证的客户端才能获得sessionId。但是为了区分第一个进行身份验证的请求和其他已经经过身份验证的后续请求,您需要另一个属性,例如messageType.

接下来,您希望能够快速通知由于网络丢失或其他连接问题而导致的断开连接;所以你需要想出一个心跳解决方案,如果心跳有跳动,你就知道连接还活着,如果没有跳动,你就知道它已经死了,并执行救援行动。

接下来您需要断开连接功能。等等。

您很快就会意识到您正在 HTTP 之上构建另一个协议。

此时,最好重用 Bayeux 等现有协议以及 CometD(基于使用 Bayeux 协议的 Comet 技术)等经过验证的解决方案,它可以为您提供:

  • Java 和 JavaScript 客户端库,具有简单但功能强大的 API
  • Java 服务器库,用于执行应用程序逻辑,无需通过带注释的服务处理 HTTP 或 WebSocket 等底层细节
  • 客户端和服务器的传输可插拔性
  • 贝叶协议可扩展性
  • 懒惰的消息
  • 聚类
  • 顶级性能
  • 面向未来:在 WebSocket 出现之前,CometD 的用户无需更改一行代码即可利用 WebSocket - 所有魔法都在库中实现
  • 基于标准
  • 由网络协议专家设计和维护
  • 扩展文档 http://docs.cometd.org
  • 我可以继续,但你明白了:)

您不想使用仅将您与 HTTP 联系在一起的低级解决方案。您希望使用更高级别的解决方案,将您的应用程序从所使用的 Comet 技术和传输 Bayeux 的协议中抽象出来,以便您的应用程序可以编写一次并利用未来的技术改进。作为技术改进的一个例子,CometD 在异步 servlet 出现之前就运行良好,现在异步 servlet 变得更具可扩展性,因此您的应用程序无需更改应用程序中的任何一行。

通过使用更高级别的解决方案,您可以专注于您的应用程序,而不是如何正确编写异步 Servlet 的血腥细节(这并不像人们想象的那么容易)。

您的问题的答案可能是:您使用 Comet+Bayeux 因为您想要站在巨人的肩膀上 http://en.wikipedia.org/wiki/Standing_on_the_shoulders_of_giants.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

异步servlet长轮询和bayeux协议(Comet)之间的区别 的相关文章

  • GWT + GAE python:COMET 和 RPC 框架

    假设我想在客户端使用 Google GWT 在服务器端使用 Google AppEngine Python 此外 我希望能够使用 RPC 调用服务器以及执行基于 COMET 的交换 就现有框架而言 我有哪些选择 我通过谷歌搜索 gwt py
  • Android:在线测试推送通知(Google Cloud Messaging)[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 Update GCM已弃用 请使用FCM 我正在我的应用程序中实现 Google Cloud Messaging 服务器代码尚未准备好 在我的环境中
  • 网络同步:优点和缺点?

    您的合作经历如何Websync http www frozenmountain com 彗星框架 在使用它之前您是否考虑过任何替代方案 到目前为止我可以这么说 Pros 非常简单易用 不需要任何服务器配置 Cons 昂贵 事实证明为我们节省
  • Glassfish - 上传图像 - 正确执行

    我使用的是最新的 glassfish 3 1 2 所以不需要 apache FileItem 并且 getPart 没有错误 我读到上传图像的最佳实践是将它们保存在文件系统上 请参阅here https stackoverflow com
  • ASP.Net MVC 和 Comet (WebSync)

    我正在尝试在我的 ASP Net MVC 2 0 项目中实现 comet 我在用着WebSync http www frozenmountain com websync 来自冰冻山 我的网站是用 C 4 0 和 ASP Net 4 0 编码
  • 异步servlet长轮询和bayeux协议(Comet)之间的区别

    简单的异步 servlet 和 Comet Bayeux 协议有什么区别 我正在尝试实现一种 服务器推送 或 反向 Ajax 类型的网页 当服务器上发生事件时 它将从服务器接收更新 因此 即使客户端没有显式发送请求 我也需要服务器能够将响应
  • Comet 应用程序的 Node.js 与 Java [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我们希望构建一个高性能 可扩展的 Comet 服务器 并首先考虑将 Java Grizzly 与 GlassFish 结合使用 但经过一些研究
  • Tomcat 7.0.32 +Spring MVC Servlet 3 异步不起作用

    我编写了非常简单的控制器来测试 Servlet 3 功能 Autowired ThreadPoolTaskExecutor taskExecutor RequestMapping value name method RequestMetho
  • SpringServletContainerInitializer 无法转换为 javax.servlet.ServletContainerInitializer

    我正在尝试将基于 xml 的 Spring MVC 应用程序移动到基于 Java 配置的应用程序 似乎与 maven 中可用的各种 java servlet 类不匹配 例如 有些提供 addServlet 方法 有些则不提供 这是我的配置类
  • 彗星服务器选择问题

    我想写一个使用comet技术进行实时更新的php网站 我有几个问题 使用彗星服务器更好吗 彗星服务器哪家好 对于comet服务器 例如orbited 我必须首先安装基于python的orbited服务器 然后编写php文件来创建套接字以连接
  • GWT 中的客户端回调

    我正在尝试为 GWT 应用程序创建一个记录器作为评估 GWT 的练习 我特别想做的是拥有它 以便我可以在服务器端的任何位置将消息发布到客户端标签 因此 如果服务器上发生了一些有趣的事情 则可以更新客户端 我的第一个问题是 这可能吗 我可以理
  • SSE 服务器发送事件 - 客户端不断发送请求(如轮询)

    为什么每个站点都解释说 在 SSE 中 客户端和服务器之间的单个连接保持打开状态 使用 SSE 客户端发送标准 HTTP 请求 请求事件流 服务器最初使用标准 HTTP 响应进行响应 并保持连接打开 然后 当服务器决定它可以向客户端发送数据
  • 对于 Part 类型,方法 getSubscribedFileName() 未定义

    我正在尝试在 servlet 3 0 gt 中上传多个文件 我在 getSubmissedFileName 方法中收到错误 为什么我会收到此错误 protected void doPost HttpServletRequest reques
  • 使用 Spring MVC 应用程序(没有 web.xml)部署简单的 HelloWorld 会出现 404 错误

    我是带有注释的 Spring MVC 新手 我之前使用过 Spring MVC XML 配置 当我尝试访问 url 时收到 404 错误http localhost 8080 HelloWorldApp http localhost 808
  • 使用java进行服务器端推送

    有没有更简单的方法cometd http cometd org作为java的长轮询框架 因为我需要的是客户端指定一些参数并将它们发送到服务器 服务器处理它们并开始连续将消息推送回客户端 看起来 就像每个服务的线程 客户端接收消息并显示它们
  • 如何在打包并部署为 WAR 的 Springboot 应用程序中启用异步支持

    当我的 SpringBoot 应用程序从可执行 JAR 运行时 下面显示的 REST 端点按预期工作 也就是说 它将文本 我的测试响应 返回给客户端 但是 当我将相同的应用程序打包为 WAR 并部署到 Tomcat 8 0 29 时 它会抛
  • Python 中 Comet 的最新推荐? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用服务器发送事件进行双向客户端-服务器通信(而不是 WebSocket)的缺点

    最近 我发现服务器发送事件是 WebSocket 的一种更简单的替代方案 用于从服务器进行推送 大多数比较它们的地方 例如here https stackoverflow com questions 5195452 websockets v
  • Jetty addFilter 使用 Spring Security 并且没有 web.xml

    通常我会添加org springframework web filter DelegatingFilterProxy在 web xml 中添加这样的代码片段
  • AJAX 进度条 - 轮询、Comet?

    我想要一些关于如何实施以下内容的建议 我想让我的用户通过 AJAX 了解在我的服务器上运行的任务的进度 我的服务器运行一个 PHP 脚本 该脚本使用 popen 函数通过 shell 命令下载文件 它定期回显 打印正在发生的事情 我想使用

随机推荐