## Enviar Mensajes a otros Applets en la misma Página

Los applets pueden encontrar otros applets y enviarles mensajes, con la siguientes restricciones de seguridad:

- Los applets deben ejecutarse en la misma página, en la misma ventana del navegador.
- Muchos visualizadores de applets requieren que los applets sean originales del mismo servidor.

Un applet puede encontrar otro applet buscándolo por su nomnbre (utilizando el método getApplet() de AppletContext) o buscando todos los applets de la página (utilizando el método getApplet() de AppletContext). Ambos métodos, si tienen éxito, le dan al llamador uno o más objetos Applet. Una vez que el llamador ha encontrado un objeto Applet, el llamador puede llamar a los métodos del objeto.

### Encontrar un Applet por el nombre: el método getApplet()

> Por defecto, un applet no tiene nombre. Para que un applet tenga nombre debe especificarse uno en el código HTML que se añade a la página del applet. Se puede especificar un nombre para un applet de dos formas diferentes:
> - Mediante la especificación de un atributo NAME dentro de la etiqueta <APPLET> del applet. Por ejemplo:

>       <applet codebase=clases/ code=Sender.class width=450 height=200 name="buddy">
>       . . .
>       </applet>

> - Mediante la especificación de un parámetro NAME con una etiqueta <PARAM>. Por ejemplo:

>       <applet codebase=clases/ code=Receiver.class width=450 height=35>
>       <param name="name" value="old pal">
>       . . .
>       </applet>

> Nota del Navegador: Las versiones 2.0 y 2.1 del Netscape Navigator no permiten que los nombres tengan letras mayúsculas. Específicamente, el método getApplet() (el método que busca un applet por su nombre) parece convertir el nombre especificado a minúsculas antes de comenzar la búsqueda del applet.

> Abajo tienes dos applets que ilustran la búsqueda por el nombre. El primero, Remitente, busca al segundo, Receptor. Cuando el Remitente encuentra al Receptor, le envia un mensaje llamando a uno de los métodos del Receptor (pasando el nombre del Remitente como un argumento). El Receptor reacciona a la llamada de este método cambiando la cadena situada a la izquierda por "Received message from sender-name!".

> Intenta Esto: Pulse el botón Send message en el applet superior (Remitente). Aparecerá alguna información de estado en la ventana del Remitente, y el Receptor confirmará (con su propia cadena de estado) que ha recibido el mensaje. Después de haber leido el mensaje del Receptor, pulsa el botón Clear del Receptor para resetearlo.

> Intenta Esto: En el campo del texto del Remitente llamado "Receiver name:", teclea buddy y pulsa Return. Como "buddy" es el nombre del propio Remitente, encontrará un applet llamado buddy pero no le enviará un mensaje, ya que no es un ejemplar de Receptor.

> Aquí tiene el programa Remitente Completo. El código es utiliza para buscar y comunicarse con el Receptor listado más abajo. El código que se puede utilizar sin cambiarlo se encuentra en negrita.

>     Applet receiver = null;
>     String receiverName = nameField.getText();      //Obtiene el nombre por el que buscar.
>     receiver = getAppletContext().getApplet(receiverName);

El Remitente se asegura de que se ha encontrado un Receptor y que es un ejemplar de la clase correcta (Receiver). Si todo va bien, el Remitente envia un mensaje al receptor. (Aquí tiene el programa del Receptor.)

    if (receiver != null) {
        //Utiliza el ejemplar del operador para asegurarse de que el applet
        //que hemos encontrado un objeto Receiver
        if (!(receiver instanceof Receiver)) {
            status.appendText("Found applet named "
                              + receiverName + ", "
                              + "but it's not a Receiver object.\n");
        } else {
            status.appendText("Found applet named "
                              + receiverName + ".\n"
                              + "  Sending message to it.\n");
            //Fuerza el tipo del Receptor a un objeto Receiver
            //(en vez de sólo un objeto applet) para que el compilador
            //nos permita llamar a un método del Receiver.
            ((Receiver)receiver).processRequestFrom(myName);
        }
    } . . .

Desde el punto de vista de un applet, su nombre es almacenado en un parámetro llamado NAME. Se puede obtener el valor del parámetro utilizando el método getParameter() de la clase Applet. Por ejemplo, el Remitente obtiene su propio nombre con el siguiente código:

    myName = getParameter("NAME");

Para más información de la utilización de getParameter(), puedes ir a Escribir el Código para Soportar Parámetros.

Los applets de ejemplo de esta página realizan una comunicación en un sólo sentido -- desde el Remitente al Receptor. Si se quiere que el Receptor también pueda enviar mensajes al Remitente, lo único que se tiene que hacer es darle al Remitente una referencia de sí mismo (this) al receptor. Por ejemplo:

    ((Receiver)receiver).startCommunicating(this);

### Encontrar Todos los Applets de una Página: El método getApplets()

> El método getApplets() devuelve una lista (una Enumeración , para ser preciso) de todos los applets que hay en la página.

> Por razones de seguridad, la mayoría de los navegadores y visualizadores de applets implementan getApplets() para que solo devuelva aquellos applets originarios del mismo servidor que el applet que llamó a getApplets(). Aquí tienes una simple lista de todos los applets que puedes encontrar en esta página:

> Abajo tienes las partes relevantes del método que llama a getApplets(). (Aquí tienes el programa completo.)

>     public void printApplets() {
>         //Una enumeración que contiene todos los applets de esta página (incluyendo este)
>         //a los que podemos enviar mensajes.
>         Enumeration e = getAppletContext().getApplets();
>         . . .
>         while (e.hasMoreElements()) {
>             Applet applet = (Applet)e.nextElement();
>             String info = ((Applet)applet).getAppletInfo();
>             if (info != null) {
>                 textArea.appendText("- " + info + "\n");
>             } else {
>                 textArea.appendText("- " + applet.getClass().getName() + "\n");
>             }
>         }
>         . . .
>     }

Ozito