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,这就是我计划这样做的方式