【问题标题】:Java Websockets + Event listeners. Is this the correct approach?Java Websockets + 事件监听器。这是正确的方法吗?
【发布时间】:2015-07-14 15:37:17
【问题描述】:

我目前正在创建一个将使用 Websockets 的 Java Web 应用程序。服务器将是一个带有 @ServerEndpoint 注释的 Java 类,称为 Server.java,而客户端将是一个 Web 浏览器,所以我肯定会使用 Javascript 访问 Websocket 端点。

我需要一个 Websocket,因为我想在服务器发生变化时通知客户端。我们有一个名为EventManager 的实用程序类,它管理子系统中发生的所有事件。我计划将Server.java 注册为EventManager 的依赖者,这样每当EventManager 有新内容时,它就会通知所有依赖者该特定事件已发生。

这是好的做法吗?我考虑过使用 AJAX/长轮询,但我相信需要观察服务器到客户端的行为。此外,我无法获取数据库中的事件,我必须依靠EventManager 来通知我的 Websocket 端点。

我想要的示例场景:

  1. 客户端 A 连接到Server.java

  2. 客户端 B 连接到 Server.java(现在,将有两个会话处于活动状态)

  3. EventManager 检测到事件并通知Server.java 的所有实例。

  4. Server.java 向所有活动的 Websocket 会话发送消息。

  5. 浏览器使用Javascript检索通过Websocket发送的数据并显示出来。

有人告诉我为此使用 Node.js,但我仍在推动 Java 实现,因为:

  1. 我完全没有使用 Node.js 的经验
  2. 我们的EventManager 类转换成这样会很痛苦 Node.js 的 Javascript

【问题讨论】:

  • 如果您正在寻找 Java 答案,为什么要使用 node.js 标记它?我们,node.js 的人一点也帮不了你。
  • 我只是想你们中的一些人可能也有意见。我不确定我的 Java 方法是否完全有效,在这种情况下,我可能会求助于 Node.js 作为最坏的情况

标签: java javascript node.js


【解决方案1】:

它将按照您建议的方式工作。几点建议:

  • 从您的事件管理器中删除僵尸服务器 (Server.java)。
  • 这将在单台服务器机器上正常工作,如果更多,会发生什么情况? Client AClient B 可能连接到不同的 http 进程。
  • 当客户端刷新页面时,您会失去连接
  • 您可以利用 ServerEndpoint 可以接收查询参数来传递状态这一事实。
  • 连接中断。请记住实现保持活动状态。
  • 每个 websocket 只能有一个消息编码器/解码器。有道理,但在 @OnMessage 方法中需要一些 if。

这是一个聊天服务器的sample implementation,它有多个使用 websockets 的服务器。

【讨论】:

  • 是的,我只会使用一个 Server.java,但是两个不同的 Websocket 连接请求不会创建两个不同的 Server.java 实例吗?
  • 哦,我明白了 - 感谢您的意见!尤其是保活部分:)
  • 最后一件事 - 你说要从 EventManager 中删除僵尸 Server.javas。这是否意味着一旦 Websocket 连接关闭,就将其从依赖项列表中删除?
  • 是的,请确保在连接关闭或丢失后删除对YourServer 实例的所有引用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-06
  • 2015-02-27
  • 1970-01-01
  • 2012-12-09
  • 2010-12-11
  • 1970-01-01
相关资源
最近更新 更多