2016-01-21 1 views
0

J'ai créé un serveur RMI sucessful, Dieu merci :)Arrêt serveur RMI (Java)

Il fonctionne parfaitement .. J'ai un JForm et il obtient en cliquant sur un activé bouton. Bien que je voulais créer un bouton pour le désactiver, mais j'ai des problèmes pour l'annuler.

Ok alors, ce qui est la façon dont je tentais d'exporter et se terminant le serveur 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); 
     } 
    }  

Je reçois cette exception:

java.rmi.NoSuchObjectException: object not exported 

à la ligne:

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

Qu'est-ce que je fais mal ici?

Résolu ................

Je l'ai découvert avant: P Anywway grâce @EJP pour la bonne réponse. Donc la solution pour moi était de créer le Registre lorsque la classe commence comme une variable publique, donc elle pourrait être utilisée dans les deux événements de clic (Démarrer le serveur et arrêter le serveur).

J'ai également supprimé beaucoup de choses absurdes qui n'étaient pas nécessaires pour désactiver le serveur RMI comme le disait @EJP.

Son travail maintenant ainsi:

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

Définir les "problèmes". Exception? Trace de la pile? Rien ne se passe? – Marvin

+0

@Marvin java.rmi.NoSuchObjectException: objet non exporté sur la ligne: "UnicastRemoteObject.unexportObject (LocateRegistry.getRegistry (port), true);" –

+1

Vous * toujours * havent inexporté votre propre objet distant, qui était le point de la question entière. Les clients peuvent toujours l'appeler, s'ils ont déjà le stub d'un 'lookup() précédent. Le message 'server offline' est donc faux. NB L'appel 'getRegistry()' dans votre nouveau code est inutile, et si vous réussissez à ne pas exporter le registre, il n'est pas nécessaire d'appeler 'unbind()'. – EJP

Répondre

1

Vous devez UNEXPORT l'objet retourné par LocateRegistry.createRegistry(). L'objet retourné par getRegistry() n'est pas l'objet Registry réelle, il est un bout. Mais ne pas utiliser le registre et appeler ensuite le unbind() n'a pas de sens. Vous devez le faire dans l'autre sens.

Et vous devez également exporter votre propre objet distant.

La création d'un nouvel objet distant dans une méthode qui tente d'annuler l'ouverture de l'objet existant n'a pas non plus de sens.