停止RMI服务器(Java)

时间:2016-01-21 21:43:28

标签: java rmi

我创建了一个成功的RMI服务器,感谢上帝:)

完美无缺.. 我有一个JForm,点击一个按钮就可以激活它。

Altough我想创建一个按钮来停用它,但是我有一个问题要解除它。

好的,这就是我尝试导出和终止RMI服务器的方式

private void btStopServerActionPerformed(java.awt.event.ActionEvent evt) {
 try {
            // Nome do objecto
            String objectname = txtObjectName.getText();
            // obtem o número da porta
            int port = Integer.parseInt(txtServerPort.getText());

            RemoteMessageObject remote = new RemoteMessageObject();
            Registry registry = LocateRegistry.getRegistry(port);
            UnicastRemoteObject.unexportObject(LocateRegistry.getRegistry(port), true);
            registry.unbind(objectname);


            System.out.println("Server offline");
        } catch (IOException ex) {
            Logger.getLogger(ServerGUI.class.getName()).log(Level.SEVERE, null, ex);
        } catch (NotBoundException ex) {
            Logger.getLogger(ServerGUI.class.getName()).log(Level.SEVERE, null, ex);
        }
    }       

我得到了这个例外:

java.rmi.NoSuchObjectException: object not exported

在这一行:

UnicastRemoteObject.unexportObject(LocateRegistry.getRegistry(port), true);

我在这里做错了什么?

解决................

我之前发现过:P Anywway感谢@EJP的正确答案。

所以我的解决方案是在类作为公共变量启动时创建Register,因此可以在两个点击事件(启动服务器和停止服务器)中使用。

我删除了很多无意义的东西,这些东西对于禁用RMI服务器是不必要的,就像@EJP所说的那样。

现在以这种方式工作:

private void btStopServerActionPerformed(java.awt.event.ActionEvent evt) {                                             

    try {
        // Nome do objecto
        String objectname = txtObjectName.getText();
        // obtem o número da porta
        int port = Integer.parseInt(txtServerPort.getText());

        Registry registry = LocateRegistry.getRegistry(port);
        UnicastRemoteObject.unexportObject(this.registry, true);
        registry.unbind(objectname);

        System.out.println("Server offline");
    } catch (IOException ex) {
        GuiUtils.addText(txtLog, "Erro", "Servidor desligado");
        btStopServer.setEnabled(false);
        btStartServer.setEnabled(true);
    } catch (NotBoundException ex) {
        Logger.getLogger(ServerGUI.class.getName()).log(Level.SEVERE, null, ex);
    }
}      

1 个答案:

答案 0 :(得分:1)

您需要取消导出LocateRegistry.createRegistry().返回的对象getRegistry()返回的对象不是实际的Registry对象,而是存根。

但是,取消移植注册表然后调用unbind()并没有意义。你必须反过来这样做。

您还必须取消导出自己的远程对象。

在一个试图取消现有的远程对象的方法中创建一个新的远程对象也没有意义。