我目前正在创建一个将使用 Websockets 的 Java Web 应用程序。服务器将是一个用 @ServerEndpoint
注释的 Java 类,称为 Server.java
,客户端将是一个网络浏览器,所以我肯定会使用 Javascript 访问 Websocket 端点。
我需要一个 Websocket,因为我想在服务器发生变化时通知客户端。我们有一个名为 EventManager
的实用程序类,它管理子系统中发生的所有事件。我计划将 Server.java
注册为 EventManager
的依赖项,以便每当 EventManager
有新内容时,它都会通知所有依赖项发生了特定事件。
这是好的做法吗?我考虑过使用 AJAX/长轮询,但我相信需要观察服务器到客户端的行为。此外,我无法获取数据库中的事件,我必须依靠 EventManager
来通知我的 Websocket 端点。
我想要的示例场景:
客户端 A 连接到
Server.java
客户端 B 连接到
Server.java
(此时,将有两个 Activity session )EventManager
检测事件并通知Server.java
的所有实例。Server.java
向所有 Activity 的 Websocket session 发送一条消息。浏览器使用 Javascript 检索通过 Websocket 发送的数据并显示它。
我被告知为此使用 Node.js,但我仍在插入 Java 实现,因为:
- 我完全没有使用 Node.js 的经验
- 我们的
EventManager
类很难转换成 用于 Node.js 的 Javascript
最佳答案
它将按照您建议的方式工作。一些提示:
- 从您的事件管理器中删除僵尸服务器 (Server.java)。
- 这在单台服务器机器上运行良好,如果有更多服务器机器会怎样?
Client A
和Client B
可能连接到不同的 http 进程。 - 当客户端刷新页面时,您将失去连接
- 您可以利用 ServerEndpoint 可以接收查询参数来传递状态这一事实。
- 连接中断。记得实现保活。
- 每个 websocket 只能有一个消息编码器/解码器。有道理,但在 @OnMessage 方法中需要一些 ifs。
这是一个sample implementation使用 websockets 的具有多个服务器的聊天服务器。
关于Java Websockets + 事件监听器。这是正确的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30043888/