HTML5 Server发送事件和多个客户端(不使用Comet)

时间:2013-03-29 23:36:20

标签: html5 java-ee comet atmosphere server-sent-events

我有一个用例,如果HTML5的Server-sent-Events适合,我想知道。

多个客户端(Javascript + HTML5浏览器)连接到Web服务器(使用Java EE后端)。每个客户可以随时查看不同的视图,具体取决于他们感兴趣的对象。

我的问题是: 如何使多个客户端(在不同的视图上)保持最新的服务器端更新,没有充斥所有客户端以及所有视图的所有更新?

我需要考虑的重点是:

  1. 许多客户可能对同一事件感兴趣。如果两个客户端正在查看相同的视图,则必须获得相同的事件。
  2. 要发送给客户端的事件取决于客户端当前所在的视图。
  3. 某些客户可能对任何事件不感兴趣(即他们可能正在查看静态数据)
  4. 给定的客户可以动态地改变他们的兴趣。例如:关闭View1并打开View2。
  5. 客户可能对多个事件渠道感兴趣(例如:两个动态变化的视图可能是单个页面的一部分)。
  6. 我只能定位完全支持SSE的浏览器。
  7. 任何时候最多只能有100个客户端(浏览器)连接到服务器。因此,我可以拥有为每个客户打开多个连接(对于SSE)的奢侈。
  8. 我搜索过SO / Google搜索SSE并且无法获得可靠的生产质量软件解决方案。在完全探索SSE之前,我不想回到旧的Comet技术。

    SSE(本身)是否能够满足这些要求? 我现在正在研究Atmosphere,但我不想诉诸于模仿SSE的一些polyfill,在决定SSE本身不够之前。

    如果无法做到,我打算做什么:
    服务器可以向所有客户端广播所有事件,让客户端弄明白。这意味着,从服务器到客户端以及复杂的客户端代码会产生大量不必要的流量。

2 个答案:

答案 0 :(得分:2)

除非您可以定位一组特定的最新浏览器,否则您将始终支持某种回退。 Atmosphere看起来是一个很好的解决方案。

关于向正确的客户发送正确的事件:在Session对象(检查Atmosphere配置为支持会话)或您自己的Map中跟踪客户端及其首选项。看起来您可以在Atmosphere中创建多个会话广播,如下所示:http://blog.javaforge.net/post/32659151672/atmosphere-per-session-broadcaster

免责声明:我自己从未使用过这个。

答案 1 :(得分:0)

当您使用EventSource注册活动时,您可以通过GET发送参数。 唯一的问题出在第4点,您应该关闭连接并重新注册事件。

我自己尝试过,效果很好。