2017-09-23 3 views
1

Je suis en train de discuter avec rmi en Java. J'ai un objet serveur et au moins deux objets clients. Lorsqu'un client envoie un message au serveur appelant la méthode recebeMensagem à distance, le serveur doit imprimer ce message sur l'écran de tous les clients (à l'exception du client qui a envoyé le message).Java RMI: comment faire appel à la méthode stub du client sur le serveur imprimer le message sur l'écran du client?

La classe client a une méthode printMenssagem(Mensagem msg), qui est appelé à distance par le serveur. Le problème est que cette méthode imprime sur l'écran du serveur. Comment faire pour imprimer le message sur l'écran du client à la place?

Server.java:

import java.rmi.NotBoundException; 
import java.rmi.RemoteException; 
import java.rmi.registry.LocateRegistry; 
import java.rmi.registry.Registry; 
import java.rmi.server.UnicastRemoteObject; 
import java.util.ArrayList; 
import java.util.function.Predicate; 

public class Server implements ChatServer { 

    private ArrayList<String> listaClientes = new ArrayList<>(); 
    private static int port = 5002; 

    public static void main(String[] args) { 

     try { 

      Server obj = new Server(); 
      ChatServer stub = (ChatServer) 
      UnicastRemoteObject.exportObject(obj, port); 

      // Bind the remote object's stub in the registry 
      Registry registry = LocateRegistry.createRegistry(port); 
      registry.bind("chat", stub); 
      System.out.println("Server ready!"); 

     } catch (Exception e) { 
      System.err.println("Server exception: " + e.toString()); 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void adicionaCliente(String user) { 

     this.listaClientes.add(user); 

    } 

    @Override 
    public void retiraCliente(String userName) { 
     Predicate<String> clientePredicate = cp -> 
     cp.equals(userName); 
     listaClientes.removeIf(clientePredicate); 
     try { 
      Registry registry = LocateRegistry.getRegistry(port); 
      registry.unbind(userName); 
     } catch (RemoteException e) { 
      e.printStackTrace(); 
     } catch (NotBoundException e) { 
      e.printStackTrace(); 
     } 

    } 

    @Override 
    public void recebeMensagem(Mensagem msg) {  

     try { 
      Registry registry = LocateRegistry.getRegistry(port); 
      for(String cliente : listaClientes) { 
       if (!cliente.equals(msg.getRemetente())) { 
        Client stub = (Client) registry.lookup(cliente); 
        stub.printMensagem(msg); 
       }      
      } 
     } catch (RemoteException e) { 
     e.printStackTrace(); 
    } catch (NotBoundException e) { 
     e.printStackTrace(); 
    } 

    } 


    public ArrayList<String> getListaClientes() { 
     return listaClientes; 
    } 

    public void setListaClientes(ArrayList<String> listaClientes) { 
     this.listaClientes = listaClientes; 
    } 



    } 

Client.java:

import java.io.Serializable; 
import java.rmi.Remote; 

public class Client implements Remote, Serializable { 

    private static final long serialVersionUID = 6864579049922061838L; 
    private static int port = 5002; 
    private static String host = "127.0.0.1"; 

    public static void main(String[] args) {   

     new Thread(new ClientInterface(host, port)).start();    
    } 


    public void printMensagem(Mensagem mensagem) { 
     System.out.println(mensagem.getRemetente() + ": " + mensagem.getMensagem()); 
    } 



} 

Répondre

1

comment faire la méthode stub client appelé un message du serveur d'impression sur l'écran du client?

Le client n'a pas de bout. Ce n'est pas un objet distant. C'est un objet sérialisable et il a été transporté dans le registre holus bolus, et il fonctionne dans toutes les JVM exécutées Registry.lookup() pour l'obtenir. Ce n'est pas ce que tu veux. Vous voulez qu'il soit un objet distant, avec un stub, donc vous devez le faire implémenter une interface distante, et l'exporter, et l'utiliser via son interface distante chez le pair.

Vous devez aussi être conscient que votre architecture actuelle ne fonctionnera pas sur plus d'un hôte, vous ne pouvez pas se lier à un registre à distance. Vous devrez ajouter une méthode d'enregistrement du client au serveur.