Modo de agente: agente remoto (estructurado)

El agente es el objeto para ayudarlo a hacer cosas, ¿por qué debería confiar que lo haga por usted? Debido a que es demasiado complicado hacer esto, hay algunos detalles que no necesita saber, así que delegue en un objeto especial para tratar.

Al igual que un agente de visas en la vida real, los materiales y procesos necesarios para las visas en diferentes países son diferentes, y algunos son muy complicados. Por lo tanto, confíe en un agente de visas que comprenda estos detalles para ayudarnos a lidiar con esto (después de todo, hay un gran error esperándonos).

Concepto local y remoto

En Java, el estándar para la división remota y local es: "Si se ejecutan en el mismo montón de memoria" .

  • El método por el cual una aplicación en una computadora llama a otra aplicación de computadora a través de la red se llama llamada remota, porque los dos programas de aplicación se ejecutan en los montones de memoria de diferentes computadoras.
  • En el sistema Android, cada aplicación se ejecuta en su propio proceso y cada proceso tiene una máquina virtual independiente, por lo que se ejecutan en diferentes montones en la misma memoria de la computadora. Las llamadas entre procesos también se llaman llamadas remotas.

Hay tres tipos de agentes :

1. Agente remoto, ayúdenos a controlar el acceso a objetos remotos:

El agente remoto puede actuar como un representante local de objetos en otra JVM. El método de llamar al agente será enviado a la ejecución remota por el agente a través de la red, y el resultado será devuelto al agente a través de la red, y el agente transferirá el resultado al cliente.

2. Agente virtual, ayúdenos a controlar el acceso para crear recursos caros

Como representante de la creación de objetos caros, los agentes virtuales a menudo no crean un objeto hasta que realmente lo necesitamos. Cuando el objeto está antes y durante la creación, el agente virtual actuará como sustituto del objeto. Después de crear el objeto, el proxy delega la solicitud directamente en el objeto.

3. Proteja al agente y controle el acceso a los recursos según los permisos.

 

Este artículo habla sobre agentes remotos:

Lo que hace el agente es controlar y administrar el acceso.
El llamado agente es representar un objeto real. De hecho, detrás de escena, el agente utiliza la red para comunicarse con un objeto real remoto. El agente finge que es un objeto real, pero de hecho todas las acciones son que el objeto agente utiliza la red para comunicarse con el objeto real.

La razón por la cual los agentes necesitan controlar el acceso es porque nuestros clientes no saben cómo comunicarse con objetos remotos. Desde un cierto punto de vista, el acceso de control de proxy remoto puede ayudarnos a lidiar con los detalles en la red.

Agente remoto El
llamado "agente remoto" es como un "representante local de un objeto remoto".
El llamado "objeto remoto" es un objeto que vive en diferentes montones de máquinas virtuales Java (JVM). En términos más generales, los objetos remotos se ejecutan en diferentes espacios de direcciones.
El llamado representante local es un objeto que puede llamarse mediante métodos locales, y su comportamiento se enviará al objeto remoto.

Entonces, cuando el objeto cliente llama al objeto proxy, es como hacer una llamada a un método remoto. De hecho, solo llama al método en el objeto "proxy" en el montón local, y el proxy maneja todos los detalles de bajo nivel de la comunicación de red. Java ya tiene una función de llamada remota incorporada, que puede ayudarnos a lograr un proxy remoto.
Las variables solo pueden referirse a objetos en el mismo espacio de almacenamiento dinámico que la instrucción de código actual.

 

JAVA RMI
RMI proporciona un objeto auxiliar de cliente (Stub) y un objeto auxiliar de servicio (Esqueleto), creando el mismo método que el objeto de servicio para el objeto auxiliar de cliente. La ventaja de RMI es que no tiene que escribir ninguna red o código de E / S usted mismo. Llamar a un método remoto (es decir, donde está el servicio real) por el programa cliente es lo mismo que hacer una llamada a un método normal a un objeto que se ejecuta en la propia JVM local del cliente.

Comience a escribir el código del servidor a continuación:

Paso 1: crea una interfaz remota

La interfaz remota define métodos que el cliente puede llamar de forma remota. Los clientes lo usarán como un tipo de clase de servicio. Tanto el código auxiliar como el servicio real implementan esta interfaz.

1. Remote es una interfaz de "signo", por lo que Remote no tiene un método. Para RMI, la interfaz remota tiene un significado especial, por lo que debemos seguir las reglas

2. Todos los métodos declarados arrojarán RemoteException, el cliente usa la interfaz remota para llamar al servicio. En otras palabras, el cliente llamará al método en el código auxiliar que implementa la interfaz remota, y la parte inferior del código auxiliar utiliza la red y la E / S, por lo que pueden suceder varias cosas malas. El cliente debe reconocer este riesgo y resolverlo manejando o declarando una excepción remota. Si un método de interfaz declara una excepción, cualquier código que llame a un método en una referencia al tipo de interfaz también debe manejar o declarar la excepción.

3. Determine si la variable y el valor de retorno son de tipo primitivo o de tipo serializable, palabra clave transitoria: indique a la JVM que no serialice este campo. Las variables y los valores de retorno de los métodos remotos deben ser de tipo primitivo o de tipo serializable. Las variables del método remoto deben empaquetarse y transportarse a través de la red, lo que depende de la serialización. Si utiliza tipos primitivos, cadenas y los tipos (incluidos arreglos y colecciones) que se establecen en muchas API, no hay problema. Si pasa su propia clase definida, debe asegurarse de que su clase implemente la interfaz serializable

import java.rmi.Remote;
import java.rmi.RemoteException;

/**
 * 定义远程接口
 */
public interface MyRemote extends Remote
{
    public String sayHello() throws RemoteException;
}

Paso 2: hacer una implementación remota

Esta es la clase que hace el trabajo real y proporciona una implementación real de los métodos remotos definidos en la interfaz remota. Este es el objeto del método que el cliente realmente quiere llamar

(1) Implemente la interfaz remota, es decir, la interfaz del método que llamará el cliente.

(2) Extienda UnicastRemoteObject
   Para convertirse en un objeto de servicio remoto, su objeto necesita ciertas funciones "remotas". La forma más fácil es extender java.rmi.server.UnicastRemoteObject y dejar que la superclase haga el trabajo por usted .

(3) Diseñe un constructor sin variables y declare que la
   superclase RemoteException UnicastRemoteObject traerá un pequeño problema: su constructor arrojará RemoteException. La única solución es declarar un constructor para su implementación remota y luego lanzar RemoteException. Cuando se instancia la clase, siempre se llama al constructor de la superclase. Si el constructor de la superclase arroja una excepción, entonces solo puede declarar que el constructor de la subclase también arroja una excepción.
 

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

/**
 * 实现远程接口,为客户端提供真正的服务
 */
public class MyRemoteImpl extends UnicastRemoteObject implements MyRemote
{

    protected MyRemoteImpl() throws RemoteException
    {
    }

    @Override
    public String sayHello()
    {
        return "Server say helloeeee";
    }

}

El tercer paso: use el trozo y el esqueleto generados por rmic

Esta es la clase auxiliar de clientes y servicios. No necesita crear estas clases usted mismo, y no le importa cuál es su código. Cuando ejecuta la herramienta rmic, se creará automáticamente. La herramienta rmic es una herramienta en el JDK que se utiliza para generar apéndices y esqueletos para una clase de servicio. La convención de nomenclatura es agregar _Stub o _Skel después del nombre de la implementación remota. rmic tiene algunas opciones para ajustar, incluyendo generar un esqueleto, ver el código fuente o incluso usar IIOP como protocolo.

La forma de usar rmic: genera la clase en el directorio actual. Tenga en cuenta que rmic debe ver su clase de implementación, por lo que puede ejecutar rmic desde el directorio donde se encuentra su implementación remota.
cd al directorio donde se ubica la implementación remota , y luego ejecute rmic MyRemoteImpl, también puede usar la ruta completa del paquete, seguido del nombre de la clase, preste atención al sufijo.

 Paso 4: Inicie el registro RMI

Rmiregistry es como una guía telefónica, donde el cliente puede encontrar la ubicación del agente, que es el objeto auxiliar del código auxiliar del cliente.
Abra una terminal e inicie rmiregistry. Primero asegúrese de que el directorio de inicio pueda acceder a nuestra clase. La forma más fácil es comenzar desde el directorio "clases".

Paso 5: iniciar el servicio remoto

Debe dejar que el objeto de servicio comience a ejecutarse. Cree una instancia de un servicio y registre el servicio en el registro RMI. Después del registro, el servicio puede ser utilizado por los clientes.
Comenzamos desde el método main () en Test, el método principal primero instanciará un objeto de servicio y luego se registrará en el registro RMI

import java.rmi.Naming;

public class Test
{
    public static void main(String[] args)
    {
        try
        {
            // 创建远程服务对象
            MyRemote service = new MyRemoteImpl();
            // 绑定远程服务对象到 rmiregistry
            Naming.bind("RemoteServer",service);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

}

 Aquí está el código del cliente:

Paso 1: copie la interfaz remota que acaba de crear


import java.rmi.Remote;
import java.rmi.RemoteException;

public interface MyRemote extends Remote
{
    public String sayHello() throws RemoteException;
}

Parte 2: escriba el cliente y acceda al código del servidor

import java.rmi.Naming;

public class MyReomteClient
{
    public static void main(String[] args)
    {
        new MyReomteClient().go();
    }

    public void go()
    {
        try {
            MyRemote service = (MyRemote) Naming.lookup("rmi://127.0.0.1/RemoteServer");
            String s = service.sayHello();
            System.out.println(s);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

El tercer paso es copiar el material generado por el servidor a la carpeta de la clase

El cuarto paso, ejecutar el cliente, puede iniciar el acceso.

138 artículos originales publicados · elogiados 34 · 150,000 visitas

Supongo que te gusta

Origin blog.csdn.net/bbj12345678/article/details/105249352
Recomendado
Clasificación