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

标签 java rmi distributed-system

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

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() 方法不是远程方法,即我遇到 illegal Remote Method Been: public Abstract java.util.Iterator java.lang。 Iterable.iterator()

我也尝试过

interface IFleet extends Remote {...}

class Fleet extends UnicastRemoteObject implements IFleet, Iterable<IShip> {...}
<小时/>

所以我有两个问题:

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

谢谢!

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

最佳答案

implements Remote

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

您的问题的答案是:

  1. 远程对象可以实现它喜欢的任何接口(interface),无论是远程接口(interface)还是其他接口(interface)。
  2. 如果它们没有出现在您的远程界面中,则它们已经被隐藏。

除非 Player 是服务器端的本地对象,否则您的代码没有意义。是这样吗。

编辑您的编辑也是错误的:

interface IFleet extends Remote, Iterable<IShip> {...}

class Fleet extends UnicastRemoteObject implements IFleet {...}

远程接口(interface)只能包含远程方法,并且必须声明它们抛出RemoteException,这就是您收到错误消息的原因:Iterable 的方法 不要抛出RemoteException

因此,您的远程接口(interface)必须扩展Remote,并且不能扩展Iterable。如果你想向客户隐瞒这一点,无论如何这是没有意义的。远程对象必须实现Iterable

I've also tried with

interface IFleet extends Remote {...}

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

这是你唯一应该尝试的事情。它有效,并且满足您的问题 (2)。

关于java - 远程对象实现中的非远程方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47732619/

相关文章:

crash - 什么是崩溃循环?

java - 鼠标拖动绘制形状

java - 是否有仅在不为空时才执行某些操作的快捷方式?

java - 使用 XPath 将元素保留在文本中

java - 序列化后在 ArrayList 上调用 equals

algorithm - 分布式系统中的投票算法

java - 如何通过 pom 运行 pmd 而不会在 Jenkins 中构建失败?

java - CORBA 和 RMI 的区别

java - 在 Java 中使用 RMI 实现领导者选举算法

hadoop - 查询Hadoop高可用性