2016-10-06 1 views
0

Je suis très novice avec RMI et j'ai décidé de l'essayer. Je me suis trompé par la méthode exportObject(Object, int). La documentation indique:Présentation de la méthode java RMI exportObject

Exporte l'objet distant pour le rendre disponible pour recevoir les appels entrants, en utilisant le port fourni particulier. L'objet est exporté avec une socket serveur créée en utilisantRMISocketFactoryclasse.

Prenons l'exemple simple:

public interface Client extends Remote { 
    void clientMethod() throws RemoteException; 
} 

public class ClientImpl implements Client { 
    public clientMethod() throws RemoteException { 
     System.out.println("clientMethod invoked"); 
    } 
} 

Client stub = (Client) UnicastRemoteObject 
       .exportObject(new ClientImpl(), 56789); //<------ HERE 

Nous créons donc un talon et le transfère à un autre VM manuellement ou par RmiRegistry, n'a pas d'importance ici.

Je suis confus par "[...] l'objet est exporté avec un socket serveur [...]"

Que signifient-ils par là?

+1

Cela signifie que l'objet distant côté serveur contiendra une socket serveur. Votre stub 'Client' contient une socket serveur sur le serveur et une socket client sur le client. Votre 'Client' est un serveur sauf s'il s'agit d'un client. –

+1

Avec tout le sérieux maintenant, comprenez-vous Java [ServerSocket] (https://docs.oracle.com/javase/8/docs/api/java/net/ServerSocket.html)? Il écoute les demandes TCP entrantes, et c'est là que RMI opère au niveau du réseau. –

+0

@ E_net4 Ainsi, lorsque nous transférons le talon à une autre VM (VM 0), le talon contiendra une connexion socket à la VM (VM 2) à laquelle il a été initialement créé. La VM 2 de trurn maintiendra un socket serveur pour accepter les invocations de méthode entrantes. Est-ce exact? –

Répondre

2
  • Un ServerSocket est créé pour écouter les connexions entrantes au port spécifié lors de l'exportation. Ce port peut être partagé entre plusieurs objets distants. La déclaration à propos du RMISocketFactory est incorrecte. Où avez-vous lu ça? Cette classe est obsolète depuis 1998.
  • Le stub contient le nom d'hôte ou l'adresse IP et le numéro de port du serveur, ainsi que certaines données internes permettant d'identifier l'objet distant auquel il appartient.
  • Les connexions TCP entre le stub et l'objet distant sont créées à la demande lorsque vous appelez des méthodes distantes, via un pool de connexions.

Ainsi, lorsque nous transférons le talon à une autre machine virtuelle (VM 0), le talon tiendra une connexion socket à la machine virtuelle (VM 2) il a été initialement créé.

Non, voir ci-dessus.

La VM 2 maintiendra à son tour un socket serveur pour accepter les invocations de méthode entrantes.

Correct.

+0

Je l'ai lu dans la documentation. Voir https://docs.oracle.com/javase/8/docs/api/java/rmi/server/UnicastRemoteObject.html#exportObject-java.rmi.Remote-int- –