RMI cllient reconnect给出了java.rmi.NoSuchObjectException:表中没有这样的对象

时间:2014-10-20 11:09:33

标签: java rmi

我试着解释一下我的设置。

环境: 我运行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服务器是完美设置的。(并且它第一次工作)

1 个答案:

答案 0 :(得分:0)

不要取消导出注册表,并且在绑定时不要创建它。首先创建它并将其保留在JVM的生命周期中。否则Naming.lookup()无法与之交谈。