我正在尝试实现一个2人的游戏,可以在网络上使用RMI。我有一个Game接口和一个实现该接口的GameImpl类。为了让客户端玩一个游戏,我有一个服务器类,如下所示:
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);
}
}另一方面,客户机类看起来如下:
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>,并在用户登录时注册正确的游戏,但我不知道如何登录,也不知道如何确保客户端进入正确的游戏。
任何帮助都是非常感谢的。
发布于 2015-05-30 00:36:47
当我使用RMI开发我的2人扫雷游戏时,我想知道完全相同的问题。首先,你必须想知道你想要如何创造游戏?
如果您决定使用第二种模式,这里有一种方法。
在服务器上,保存当前连接的播放机列表。每当客户端连接到服务器并成功登录时,将他添加到该列表中:
/** The connected players */
private List<Player> connectedPlayers;还准备一个地图与每个玩家关联的游戏实例(顺便说一句,你在正确的轨道上!)
/** The games currently being played */
private Map<Player, Game> gameList;当在两个玩家之间创建一个游戏(player1想要使用player2)时,将它们添加到游戏列表中。
Game game = new Game(player1, player2);
this.gameList.put(player1, game);
this.gameList.put(player2, game);如果您需要知道用户是否可用,并且尚未在游戏中使用:
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名玩家从地图上移除。
this.gameList.remove(game.getPlayerHost());
this.gameList.remove(game.getPlayerClient());我无法在这里复制/粘贴更多的代码,但是如果您需要灵感,您可以在我的游戏中找到源代码。这些文件很有趣:
发布于 2015-05-29 23:08:27
首先,你是在极低的水平上处理这个问题的。除非您有很好的理由,否则您应该考虑使用更高级别的抽象,例如.
这些技术将允许您继续使用RMI作为您的传输,但也可以轻松地使用会话外观构建组件。
独自一人做这件事将是非常乏味的。
来澄清一下我的答案。您应该使用会话外观模式存储您的游戏对象。
这是你的中心问题..。
我不知道如何做登录,或如何确保客户端获得正确的游戏。
这是一个看似复杂的问题。
https://stackoverflow.com/questions/30539278
复制相似问题