2016-11-29 25 views

回答

1

两者都用于不同的用途,一个允许等待慢速资源(长轮询),另一个允许在同一个TCP连接上发送数据流。

下面是更详细地:

  • AsyncResponse在JAX-RS 2被引入,以便执行长轮询请求。

    1. 客户端打开的连接
    2. 客户端发送请求负载
    3. 服务器接收的有效载荷,暂停/暂停的连接,并寻找资源
    4. 然后
      1. 如果超时已达到服务器可以结束连接
      2. 资源就绪,服务器恢复连接并发送资源有效载荷。
    5. 连接已关闭

    由于这是JAX-RS规范的一部分,所以你可以使用默认球衣依赖使用它。请注意,在没有传输数据的连接太长的情况下,防火墙等网络设备可以关闭TCP连接。

  • Server-Sent Events是一个specification,它允许服务器在同一个TCP连接上发送消息。

    1. 客户端采用javascript EventSource来获取资源
    2. 然后服务器可以在某个时间点发送有效载荷的消息。
    3. 然后另一个
    4. 等等
    5. 的连接可以通过编程在任何时间由客户端或服务器关闭。

    SSE不是JAX-RS的一部分,所以你需要有泽西SSE模块在类路径(additionaly泽西2的早期版本中,你不得不编程启用SseFeature)。

    其他的事情要考虑:

    • SSE不允许通过自定义页眉,所以没有授权头。可以使用URL查询字符串,但如果您不在HTTPS上,则会出现安全问题。
    • SSE确实允许POST数据,所以这可能在URL查询字符串
    • 由于网络(设备故障,防火墙,电话不在覆盖区域等),连接可以关闭。)

    在我看来,websockets比SSE更灵活,甚至允许客户端发送多条消息。但是Jersey没有实现支持websocket的JEE规范(JSR 356)。


不过说真的,你应该阅读自己的SSE implementation,他们的喜欢什么是轮询,什么网络插座附加信息的文档。

1

AsyncResponse就像一个等待时间长的ajax轮询。客户端启动单个AJAX请求来检查更新,直到它接收到数据或发生超时并触发另一个请求才会返回。它确实创建了不必要的检查循环(在服务器端),负载等同于连接的客户端数量。更多的客户端,更多的循环启动=需要更多资源。

服务器发送的事件有点类似于服务器端的长轮询,都使用循环来检查更新并触发响应。唯一的区别是长轮询会连续发送请求(在超时或接收数据后),而SSE只需要发起一次。因此,当考虑电池使用时,SSE更适合移动应用。

Websocket也使用循环,但不仅用于检查更新;也可以在握手后监听新连接并升级到WS/WSS的连接。与长轮询和上证所不同,负载随着客户端数量的增加而增加,websocket像守护进程一样不停地运行循环。除了常量循环之外,随着更多客户端连接到套接字,负载也会增加。例如,如果您正在设计一个用于管理目的的Web服务,那么在长时间轮询和SSE上运行的服务器可以在办公时间后无人休息时休息,而websocket将继续运行,等待连接。我提到没有适当的身份验证,任何人都可以创建一个客户端并连接到您的websocket?大多数情况下,认证和拒绝连接不是在握手部分完成的,而是在连接完成后完成的。

我应该继续如何在多个选项卡上实现websocket?

相关问题