首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >登录到RMI服务器上

登录到RMI服务器上
EN

Stack Overflow用户
提问于 2015-05-29 21:22:12
回答 2查看 1K关注 0票数 3

我正在尝试实现一个2人的游戏,可以在网络上使用RMI。我有一个Game接口和一个实现该接口的GameImpl类。为了让客户端玩一个游戏,我有一个服务器类,如下所示:

代码语言:javascript
复制
public class RMIServer {

    public RMIServer(int port) throws RemoteException, AlreadyBoundException {
        Registry registry = LocateRegistry.createRegistry(port);
        Game game = new GameImpl();
        registry.bind("Game", game);
    }

    public static void main(String[] args) throws RemoteException, AlreadyBoundException {
        RMIServer server = new RMIServer(1099);
    }

}

另一方面,客户机类看起来如下:

代码语言:javascript
复制
public class RMIClient {

    RMIClient(String host, int port) throws RemoteException, NotBoundException {
        Registry registry = LocateRegistry.getRegistry(host, port);
        Game game = (Game) registry.lookup("Game");
        game.play();
    }

    public static void main(String[] args) throws RemoteException, NotBoundException {
        RMIClient client = new RMIClient("127.0.0.1", 1099);
    }

}

如果只有一个玩家需要在网络上玩游戏的话,这个实现是很好的。我现在遇到的问题是,我想登录,这样两个不同的玩家就可以在网络上互相竞争了。主要的问题是,我真的不知道去哪里与可能的用户和他们的所有游戏,我如何可以检查他们的登录。

我考虑在服务器中保留一个Map<User, Game>,并在用户登录时注册正确的游戏,但我不知道如何登录,也不知道如何确保客户端进入正确的游戏。

任何帮助都是非常感谢的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-30 00:36:47

当我使用RMI开发我的2人扫雷游戏时,我想知道完全相同的问题。首先,你必须想知道你想要如何创造游戏?

  1. 你想要创建一个游戏之间的前两个可用的球员(“玩尽快”模式)?示例:
  • player1连接- player2连接-服务器自动启动player1和player2之间的游戏。
  1. 你想让玩家选择他们的对手(沙龙)吗?示例:
  • player1连接- player2连接- player3连接- player1决定开始与player3的游戏

如果您决定使用第二种模式,这里有一种方法。

在服务器上,保存当前连接的播放机列表。每当客户端连接到服务器并成功登录时,将他添加到该列表中:

代码语言:javascript
复制
/** The connected players */
private List<Player> connectedPlayers;

还准备一个地图与每个玩家关联的游戏实例(顺便说一句,你在正确的轨道上!)

代码语言:javascript
复制
/** The games currently being played */
private Map<Player, Game> gameList;

当在两个玩家之间创建一个游戏(player1想要使用player2)时,将它们添加到游戏列表中。

代码语言:javascript
复制
Game game = new Game(player1, player2);
this.gameList.put(player1, game);
this.gameList.put(player2, game);

如果您需要知道用户是否可用,并且尚未在游戏中使用:

代码语言:javascript
复制
public boolean isUserAvailable(String potentialOpponent) throws RemoteException {
    for (Entry<Player, Game> entry : this.gameList.entrySet()) {
        if (entry.getKey().getUsername().equals(potentialOpponent)) {
            return false;
        }
    }
    return true;
}

当游戏结束时,将2名玩家从地图上移除。

代码语言:javascript
复制
this.gameList.remove(game.getPlayerHost());
this.gameList.remove(game.getPlayerClient());

我无法在这里复制/粘贴更多的代码,但是如果您需要灵感,您可以在我的游戏中找到源代码。这些文件很有趣:

票数 2
EN

Stack Overflow用户

发布于 2015-05-29 23:08:27

首先,你是在极低的水平上处理这个问题的。除非您有很好的理由,否则您应该考虑使用更高级别的抽象,例如.

  1. 弹簧框架和可选的也可以是弹簧安全远程RMI
  2. 企业JavaBeans
  3. 阿帕奇骆驼

这些技术将允许您继续使用RMI作为您的传输,但也可以轻松地使用会话外观构建组件

独自一人做这件事将是非常乏味的。

来澄清一下我的答案。您应该使用会话外观模式存储您的游戏对象。

这是你的中心问题..。

我不知道如何做登录,或如何确保客户端获得正确的游戏。

这是一个看似复杂的问题。

  1. “如何登录”是一个帐户服务的实现(包括令牌/cookie)。
  2. “如何确保客户端获得正确的游戏”是会话范围的实现,它可以保留游戏对象并将其返回给呈现正确令牌/凭据的用户。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30539278

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档