远程对象实现中的非远程方法

时间:2017-12-09 20:00:24

标签: java rmi distributed-system

我正在为学校的Battleship游戏分发版本(rmi)。在游戏中,每个玩家都有一个舰队和一个网格,所以我希望能够使用迭代器来编写代码

T: ValueReader

但是我的班级ArbitraryTypeReader也需要是一个远程班级,所以我有类似的东西

class Fleet implements Iterable<Ship> {

    private List<Ship> fleet;
    ...
    @Override
    public Iterator<Ship> iterator() { return fleet.iterator(); }
}

class Player {

    private Fleet fleet;
    ...
    public void placeFleet() {
        for (Ship s : fleet) {
            ...
        }
    }
}

但是,这会导致错误,因为Fleet方法不是远程方法,即我得到interface IFleet extends Remote, Iterable<IShip> {...} class Fleet extends UnicastRemoteObject implements IFleet {...}

我也试过

iterator()

所以我有两个问题:

  1. 远程对象可以只实现Remote及其子接口吗?
  2. 我可以以某种方式隐藏rmi客户端远程对象中的方法(使它们不可用,从而允许它们 NOT 来尊重远程接口需求)?
  3. 谢谢!

    Ps:我知道我可以通过其他方式在客户端列表中使用迭代器,但是这个错误让我想知道是否可以与Remote一起实现其他接口。

1 个答案:

答案 0 :(得分:1)

implements Remote

这已经错了。您必须定义自己的远程接口,扩展 Remote,并实现 。我怀疑这是导致问题的原因。你根本没有任何实际的远程方法。事实上UnicastRemoteObject已经实现了Remote

您的问题的答案是:

  1. 远程对象可以实现它喜欢的任何接口,无论是远程还是其他。
  2. 如果它们没有显示在您的远程界面中,它们就已被隐藏。
  3. 除非Player是服务器端的本地对象,否则您的代码没有意义。是这样吗。

    编辑您的编辑错误:

    interface IFleet extends Remote, Iterable<IShip> {...}
    
    class Fleet extends UnicastRemoteObject implements IFleet {...}
    

    远程接口只能包含远程方法,并且必须声明它们抛出RemoteException,这就是您收到错误消息的原因:Iterable don&#的方法39;扔掉RemoteException

    因此,您的远程接口必须扩展Remote,而扩展Iterable。如果你想将它隐藏在客户端之外,它无论如何都没有意义。必须实施 Iterable的远程对象

      

    我也试过

    interface IFleet extends Remote {...}
    
    class Fleet extends UnicastRemoteObject implements IFleet, Iterable<IShip> {...}
    

    这是你唯一应该尝试的东西。它有效,它满足你的问题(2)。