簡體   English   中英

停止 RMI 服務器 (Java)

[英]Stopping RMI Server (Java)

我創建了一個成功的 RMI 服務器,感謝上帝:)

它完美地工作.. 我有一個 JForm,它被激活點擊一個按鈕。

雖然我也想創建一個按鈕來停用它,但是我在取消導出它時遇到了問題。

好的,這就是我嘗試導出和終止 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 無論如何感謝@EJP 的正確答案。

因此,我的解決方案是在類作為公共變量啟動時創建 Register,因此它可以在兩個單擊事件(啟動服務器和停止服務器)中使用。

我刪除了太多廢話,就像@EJP 所說的那樣,這些內容對於禁用 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());

        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);
    }
}      

您需要LocateRegistry.createRegistry().導出LocateRegistry.createRegistry().返回的對象LocateRegistry.createRegistry(). getRegistry()返回的對象不是實際的Registry對象,它是一個存根,您不能取消導出它們。

但是unbind()導出注冊表然后調用unbind()沒有意義。 反過來做有一點意義,但意義不大。

而且您還必須取消導出您自己的遠程對象。

在試圖取消導出現有對象的方法中創建新的遠程對象也沒有意義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM