gpt4 book ai didi

跨端点的 Java websockets 共享 session

转载 作者:行者123 更新时间:2023-11-29 22:02:03 25 4
gpt4 key购买 nike

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

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

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

}

这让我暗示 session 数据不幸没有跨端点共享。

我有什么好的方法可以跨多个类共享 websocket session 数据吗?

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

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

最佳答案

包含所有玩家和游戏数据的单例 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(或在带有配置器的 header 中),这就是我计划这样做的方式。

关于跨端点的 Java websockets 共享 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23232614/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com