"这"使用RMI

时间:2017-01-01 16:37:44

标签: java reference rmi

我正在努力解决问题。我有客户&服务器程序,我使用RMI在它们之间进行通信。

方法" connect"在客户端调用,客户端将其自己的引用作为参数stub.connect(this)

传递

connect(this)方法中,服务器将this(客户端引用)放在List和HashMap中。我已经检查过它们都已填充。

问题是,当我想在Map或List中找到引用时,似乎this已经改变了。例如,我从客户端调用move(this,direction),服务器在map& amp;中找不到关联的客户端。 HashMap中。

以下是stub.connect(this)来电代码:

    public class Client extends JFrame implements KeyListener, IClient{

        private IServer stub;
        private Grid gameGrid;

        public Client() throws AccessException, RemoteException, NotBoundException{
            gameGrid = new Grid();
            setTitle("Sweet collector game");
            setSize(840, 560);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            add(gameGrid);
            setVisible(true);
            addKeyListener(this);

            Registry registry = LocateRegistry.getRegistry(10000);
            stub = (IServer) registry.lookup("IServer");
            stub.connect(this);
       }

服务器端连接方法:

public void connect(IClient c) throws RemoteException {
    System.out.println("New player joined the game !");
    this.currentPlayers.add(c);
    Random rand = new Random();
    Position2D<Integer,Integer> init = new Position2D<Integer,Integer>(rand.nextInt(gridsize-1),rand.nextInt(gridsize-1));
    while(this.sweetsPosition.contains(init) || this.playersPosition.containsValue(init)){
        init = new Position2D<Integer,Integer>(rand.nextInt(gridsize-1),rand.nextInt(gridsize-1));
    }
    this.playersPosition.put(c,init);
}

但是当我从同一个客户端调用move(this,direction)时,它无法在列表/地图中找到正确的对象:

public void move(int direction, IClient c) throws RemoteException {
        if(this.playersPosition.containsKey(c)){ //always return FALSE for a reason I ignore

来自(显然,相同)客户的电话:

public void keyPressed(KeyEvent k) {
    int keyCode = k.getKeyCode();
    try {
        stub.move(keyCode, this);

我希望我能充分暴露我的问题。我真的需要你的帮助,我认为我不能单独解决这个问题......也许它甚至与RMI无关。

非常感谢。

1 个答案:

答案 0 :(得分:1)

每次通过RMI传递IClient时,接收器都会收到不同的对象。除非IClient正确实现equals()hashCode(),否则它将无法用作散列映射关键字。

您还应该通过序列化传递JFrame。请参阅Javadoc以获取重大警告,无论如何它都没有意义。重构。