RMI表中没有这样的对象,服务器通信错误

时间:2010-04-17 15:15:51

标签: java networking rmi distributed-computing

我的目标是创建一个分布式计算程序,同时启动服务器和客户端。我需要它能够在几台机器上安装并让所有机器相互通信,即主节点和5个从节点都来自一个应用程序。

我的问题是我无法正常使用unicastRef,我认为在同一个端口上启动所有内容是一个问题,我有一个更好的方式可以忽略吗?

这是我的代码的一部分(重要的部分)

尝试{

        RMIServer obj = new RMIServer();
        obj.start(5225);

    } catch (Exception e) {
       e.printStackTrace();

    }


      try {
            System.out.println("We are slave's ");
            Registry rr = LocateRegistry.getRegistry("127.0.0.1", Store.PORT, new RClient());

            Call ss = (Call) rr.lookup("FILLER");

            System.out.println(ss.getHello());

        } catch (Exception e) {
            e.printStackTrace();
        }
}

这是我的主要课程(上图)

这是服务器类(下面)

public RMIServer(){         }

    public void start(int port) throws Exception {

        try {

            Registry registry = LocateRegistry.createRegistry(port, new RClient(), new RServer());

            Call stuff = new Call();

            registry.bind("FILLER", stuff);

            System.out.println("Server ready");
        } catch (Exception e) {
            System.err.println("Server exception: " + e.toString());
            e.printStackTrace();
        }
    }

我不知道我错过了什么或者我忽略了什么,但输出看起来像这样。

收听5225 请听8776 服务器就绪 我们是奴隶的 请听8776 java.rmi.NoSuchObjectException:表中没有这样的对象         at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:255)         at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:233)         at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:359)         at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)         在Main.main(Main.java:62)

第62行是:::调用ss =(调用)rr.lookup(“FILLER”);

1 个答案:

答案 0 :(得分:1)

也许是因为您对服务器类中存根的引用是try块的本地引用,并且引用后立即被垃圾收集。请尝试将stuff改为类变量。