我的RMI测试出了问题...
服务器:
LocateRegistry.createRegistry(non-default-port);
obj = new HelloImpl();
Naming.rebind("//ip-of-server/HelloServer", obj);
客户端:
RMISocketFactory.setSocketFactory(new sun.rmi.transport.proxy.RMIHttpToCGISocketFactory());
obj = (Hello) LocateRegistry.getRegistry("ip of server", non-default-port).lookup( "HelloServer");
obj.sayHello("test");
所有对象在类中都是静态的。
但是我得到了一个“java.rmi.NoSuchObjectException:表中没有这样的对象”-Exception一直都是.. 如果我通过
使用HTTP隧道,则只会发生这种情况RMISocketFactory.setSocketFactory(new sun.rmi.transport.proxy.RMIHttpToCGISocketFactory());
如果我尝试没有HTTP隧道(来自普通网络中的其他PC),它可以正常工作!
可能是什么问题?
答案 0 :(得分:0)
您将从SELECT
而非sayHello()
获取此信息。异常的含义是存根是“陈旧的”,即远程对象已被取消导出,这可能意味着它也是DGC。您应该按顺序尝试以下一项:
保持对lookup()
返回的值的静态引用。
这本身就足够了,但如果不是:
保持对远程对象本身的静态引用,不,我不是指它的存根。在这种情况下,createRegistry()
。
我无法解释为什么它只通过HTTP隧道发生,但无论如何你应该在所有情况下做(1),所以真的是等待通过任何方式发生的错误。