我正在尝试找出一种组织 javax.websocket
的好方法我正在开发的多人纸牌游戏。
我想将我的代码分成多个类,每个类都是一个 ServerEndpoint
.我的问题是我需要一种在它们之间共享 session 数据的有效方法。
我在“/index”处有一个索引,这是我当前正在创建的位置 Player
客户的对象。我是这样设置的:
@ServerEndpoint("/index")
public class IndexEndpoint {
@OnOpen
public void openConnection(Session session) {
session.getUserProperties().put("player", new Player());
}
}
那行得通;我可以访问 Player
整个其他地方的对象 IndexEndpoint
.
但是当我尝试从另一个端点访问用户属性时(在 JavaScript 中与 IndexEndpoint
建立连接后,等待 5 秒,然后在同一页面上打开与 LobbyEndpoint
的附加连接),我得到null
.
@ServerEndpoint("/lobby")
public class LobbyEndpoint {
@OnOpen
public void openConnection(Session session) {
System.out.println(session.getUserProperties().get("player")); // prints null
}
}
这让我暗示 session 数据不幸没有跨端点共享。
我有什么好的方法可以跨多个类共享 websocket session 数据吗?
我想一种解决方案是只为所有用户连接一个 über 端点,它可以处理任何消息类型。然后该端点将消息数据委托(delegate)给我的应用程序的其他部分。
但是我觉得这样的设计会非常困惑和限制。我希望端点专用于特定房间,使用像 @ServerEndpoint("/rooms/{room-id}")
这样的注释和 @PathParam("room-id")
.因此,如果我使用的是整体端点,那么我就不能那样做;我无法知道连接用户是否是访问房间的用户。
最佳答案
包含所有玩家和游戏数据的单例 EJB 怎么样?
@Stateless
@ServerEndpoint("/lobby/{sessionKey}")
public class IndexEndpoint {
@EJB
GameData data;
@OnOpen
public void onOpen(Session session, EndpointConfig config,
@PathParam("sessionKey") int id) {
Player player = data.getPlayer(id);
session.getUserProperties().put("player", player);
}
}
来自 IndexEndpoint 的第一条消息可以向客户端提供其 ID,然后客户端可以将其 ID 提供给 ws URL 中的 LobbyEndpoint(或在带有配置器的 header 中),这就是我计划这样做的方式。
关于跨端点的 Java websockets 共享 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23232614/