我正试图找出一种组织我正在进行的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")
等注释将端点专用于特定的会议室。因此,如果我使用单片端点,那么我就不能这样做;我无法知道连接用户是否是访问该房间的用户。
答案 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的头文件),这就是我计划的方式。