我试着解释一下我的设置。
环境: 我运行1“服务器”(注意:不是rmi服务器)总是在运行。 当我运行1个客户端时,客户端会像这样创建一个rmi主机:
String bindLocation = "//localhost/ntn";
try {
registry = LocateRegistry.createRegistry(1099);
Naming.bind(bindLocation, ntn);
} catch (MalformedURLException | AlreadyBoundException e) {}
服务器开始充当RMI客户端,如下所示:
try {
name = "//localhost/ntn";
ntnI = null;
ntnI = (NodeToNodeInterface) Naming.lookup(name);
ntnI.serverAnswer(k);
k++;
} catch(Exception e) {
System.err.println("FileServer exception: "+ e.getMessage());
e.printStackTrace();
}
这一切都有效。但在此之后,客户端收到了“服务器答案”,它就像这样解除绑定:
try {
Naming.unbind(bindLocation);
UnicastRemoteObject.unexportObject(registry,true);
} catch (NotBoundException e) {}
现在,如果我打开一个第二个客户端(与客户端1相同的代码),它再次开始充当同一名称和端口上的RMI服务器。如果设置了相同的功能,则在服务器上运行并发出以下错误:
java.rmi.NoSuchObjectException: no such object in table
指向这条线:
ntnI = (NodeToNodeInterface) Naming.lookup(name);
我如何重新初始化它?或者如何解决这个问题? 通常,在服务器(RMIclient)使用serverAnswer函数之前,RMI服务器是完美设置的。(并且它第一次工作)
答案 0 :(得分:0)
不要取消导出注册表,并且在绑定时不要创建它。首先创建它并将其保留在JVM的生命周期中。否则Naming.lookup()
无法与之交谈。