【问题标题】:Java websockets shared session across endpointsJava websockets 跨端点共享会话
【发布时间】:2015-06-27 12:14:05
【问题描述】:

我正在尝试找出一种好方法来组织我正在开发的javax.websocket 多人纸牌游戏。

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

我在“/index”有一个索引,这是我目前为客户创建Player 对象的地方。我是这样设置的:

@ServerEndpoint("/index")
public class IndexEndpoint {

  @OnOpen
  public void openConnection(Session session) {
    session.getUserProperties().put("player", new Player());
  }

}

这行得通;我可以在整个IndexEndpoint 的其他地方访问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/{room-id}")@PathParam("room-id") 之类的注释将端点专用于特定房间。因此,如果我使用的是单体端点,那么我就无法做到这一点;我无法知道连接用户是否是访问房间的用户。

【问题讨论】:

    标签: java javascript session websocket


    【解决方案1】:

    包含所有玩家和游戏数据的单例 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 中(或在带有 Configurator 的标头中)将其 id 提供给 LobbyEndpoint,这就是我打算这样做的方式。

    【讨论】:

      猜你喜欢
      • 2016-12-29
      • 1970-01-01
      • 2014-08-13
      • 1970-01-01
      • 1970-01-01
      • 2011-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多