Java websockets跨端点共享会话

时间:2014-04-23 00:19:06

标签: java javascript session websocket

我正试图找出一种组织我正在进行的javax.websocket多人纸牌游戏的好方法。

我想将我的代码分成多个类,每个类都是ServerEndpoint。我的问题是我需要一种在它们之间共享会话数据的有效方法。

我在“/ 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
  }

}

这导致我暗示会话数据很遗憾不会在端点之间共享。

我有什么好方法可以跨多个班级分享websocket会话数据吗?

我想一个解决方案是只为所有用户连接一个über端点,并且可以处理任何消息类型。然后该端点将消息数据委托给我的应用程序的其他部分。

但是我觉得这种设计会非常混乱和限制。我希望使用@ServerEndpoint("/rooms/{room-id}")@PathParam("room-id")等注释将端点专用于特定的会议室。因此,如果我使用单片端点,那么我就不能这样做;我无法知道连接用户是否是访问该房间的用户。

1 个答案:

答案 0 :(得分:2)

包含所有玩家和游戏数据的单例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(或带有Configurator的头文件),这就是我计划的方式。