Java websockets跨端点共享会话
我正试图找出一个好方法来组织我正在开发的Java websockets跨端点共享会话,java,javascript,session,websocket,Java,Javascript,Session,Websocket,我正试图找出一个好方法来组织我正在开发的javax.websocket多人纸牌游戏 我想将代码分成多个类,每个类都是一个ServerEndpoint。我的问题是,我需要一种在他们之间共享会话数据的有效方法 我在“/index”处有一个索引,这是我当前为客户端创建Player对象的地方。我是这样设置的: @ServerEndpoint("/index") public class IndexEndpoint { @OnOpen public void openConnection(Ses
javax.websocket
多人纸牌游戏
我想将代码分成多个类,每个类都是一个ServerEndpoint
。我的问题是,我需要一种在他们之间共享会话数据的有效方法
我在“/index”处有一个索引,这是我当前为客户端创建Player
对象的地方。我是这样设置的:
@ServerEndpoint("/index")
public class IndexEndpoint {
@OnOpen
public void openConnection(Session session) {
session.getUserProperties().put("player", new Player());
}
}
这是可行的;我可以在索引点
的其他位置访问播放器
对象
但是,当我尝试从另一个端点访问用户属性时(在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
}
}
这让我暗示,不幸的是,会话数据没有在端点之间共享
有什么好方法可以让我在多个类之间共享websocket会话数据吗?
我想一个解决方案是让所有用户都可以连接到一个über端点,它可以处理任何消息类型。然后,该端点将消息数据委托给我的应用程序的其他部分
但是我觉得这个设计会非常混乱和限制。我希望使用诸如
@ServerEndpoint(“/rooms/{roomid}”)
和@PathParam(“roomid”)
之类的注释将端点专用于特定的房间。所以,如果我使用的是单片端点,那么我就不能这样做;我无法知道连接用户是否是访问房间的用户。包含所有玩家和游戏数据的单例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,然后客户机可以在ws-URL中(或在带有配置器的标头中)向LobbyEndpoint提供其id,这就是我计划这样做的方式