Red de conocimiento informático - Conocimiento informático - ¿El acceso del cliente al servidor es un método de acceso a la interfaz remota o un método de instancia para acceder directamente a la interfaz remota?

¿El acceso del cliente al servidor es un método de acceso a la interfaz remota o un método de instancia para acceder directamente a la interfaz remota?

Java Remoting

La invocación de método remoto de Java (RMI) proporciona la función de comunicación remota del lenguaje de programación Java. Esta función permite que los programas que se ejecutan en el cliente llamen a objetos en el servidor remoto, lo que permite a los programadores de Java realizar operaciones distribuidas. el medio ambiente.

Para crear un programa simple de llamada a métodos remotos distribuidos en Java, siga los siguientes pasos:

1. Defina la interfaz remota:

En Java, los objetos remotos son. una instancia de una clase que implementa la interfaz remota, que declara que cada método se llamará de forma remota. Cuando necesitamos crear un objeto remoto, pasamos una interfaz para ocultar los detalles de implementación de la capa base, y el cliente solo necesita enviar mensajes a través del identificador de la interfaz.

La interfaz remota tiene las siguientes características:

1) La interfaz remota debe ser un atributo público. De lo contrario, a menos que el cliente esté en el mismo paquete que la interfaz remota, la llamada generará un error al intentar cargar un objeto remoto que implemente la interfaz remota.

2) La interfaz remota debe extender la interfaz java.rmi.

3) Además de las excepciones específicas de la aplicación en sí, cada método en la interfaz remota debe declarar la clase java.rmi.RemoteException (o una clase principal de RemoteException). (o una clase principal de RemoteException).

4) Los objetos remotos pasados ​​como parámetros o valores de retorno (ya sea pasados ​​directamente o incrustados en objetos locales) deben declararse como interfaces remotas, no como clases de implementación.

La siguiente es la definición de la interfaz remota

[java] ver copia simple

prueba del paquete

importar java.rmi.

importar java.math.BigInteger;

interfaz pública Fib extiende Remoto {

public int getFib(int n) lanza RemoteException

>/ / public BigInteger getFib(BigInteger n) lanza RemoteException;

}

II.

Implementar la interfaz remota:

Clase de implementación RemoteObject Debe extender la clase RemoteObject java.rmi.UnicastRemoteObject. UnicastRemoteObject e implementa la interfaz remota definida. La clase de implementación de objetos remotos contiene el código que implementa los métodos remotos especificados por cada interfaz remota. La clase también puede contener otros métodos, pero los clientes sólo pueden utilizar métodos desde la interfaz remota. Esto se debe a que el cliente es un identificador de la interfaz, no la clase de la interfaz. Debes definir un constructor para el objeto remoto, incluso si solo vas a definir un constructor predeterminado que llame al constructor de la clase base. Debido a que el constructor de la clase base puede generar una excepción java.rmi.RemoteException, usted debe generar una excepción java.rmi.RemoteException incluso si no tiene otro uso.

La siguiente es la declaración de la clase de implementación del objeto remoto:

[java] ver copia simple

paquete de prueba

importar java; .math.BigInteger;

importar java.rmi.RemoteException;

importar java.rmi.RemoteException;

La clase pública FibImp extiende UnicastRemoteObject implementa Fib {

Public FibImp() lanza RemoteException {

super()

}

public int getFib(int n) lanza RemoteException {

return n

}

}

}

Tres: Escribe la clase del servidor:

La clase que contiene el método principal puede ser la clase de implementación misma, o puede ser otra clase completamente diferente. A continuación, cree una instancia del objeto remoto a través de RmiSampleServer e inicie el programa de servicio de registro desde el número de puerto especificado mediante el método createRegistry de la clase java.rmi.registry.LocateRegistry. También puede iniciar el programa de servicio de registro ejecutando rmiregistry. comando, que es el registro El puerto de ejecución predeterminado para los programas de servicio de tabla. El puerto de ejecución predeterminado del programa de servicio de registro es 1099.

El nombre del objeto remoto debe estar vinculado a la referencia del objeto remoto:

import java.rmi.Naming

import java.rmi.RemoteException

import java; rmi.registry.LocateRegistry;

clase pública FibonacciServer {

/**

* @param args

*/

public static void main(String[] args) {

prueba {

LocateRegistry.createRegistry(8804);

FibImp f = new FibImp ();

//Registrarse en el registro

Naming.rebind("//localhost:8804/SAMPLE-SERVER", f

); System .out.println("servidor fib listo");

} catch (RemoteException re) {

System.out.println("Excepción en FibonacciImpl.main: " re) ;

} captura (MalformedURLException e) {

System.out.println("MalformedURLException " e);

}

}

}

4. Escriba una clase de cliente que utilice servicios remotos:

Cliente. La clase tiene dos funciones principales: una es construir el servicio de registro a través del método Naming.lookup y crear la instancia del programa auxiliar del programa de servicio de registro. La otra es llamar al método remoto en el objeto remoto del servidor.

La siguiente es la declaración de la clase de cliente:

[java] ver copia simple

paquete testClient

importar test.Fib;

importar java.math.RemoteException

clase pública FibClient {

/**

* @param args

*/

public static void main(String[] args) {

String url = "//localhost:8804/SAMPLE-SERVER"

;

prueba {

Fib calc = (Fib) Naming.lookup(url)

FOR (int i = 0; i lt; 10; i) {

>

int f = calc.getFib(i);

System.out.println(f

}

} captura (MalformedURLException e); ) {

e.printStackTrace();

} captura (RemoteException e) {

e.printStackTrace(); captura ( NotBoundException e) {

e.printStackTrace()

}

}

}