Komunikacja pomiędzy apletami

Aplet może wysyłać i odbierać komunikaty od innych apletów pod warunkiem spełnienia następujących kryteriów:

Aplet potrafi znaleźć inny aplet przez podanie jego nazwy (przy wykorzystaniu metody AppletContext getApplet) lub przez wyszukanie wszystkich apletów na stronie (przy wykorzystaniu metody AppletContext getApplets). W przypadku, gdy wyszukiwanie to zakończy się powodzeniem, zostanie zwrócony jeden lub wiele obiektów typu Applet. Gdy aplet wywołujący znalazł obiekt typu Applet, może on wywoływać metody należące do znalezionego apletu.

Znajdowanie apletów przez podanie nazwy. Metoda getApplet

Domyślnie aplet nie posiada żadnej nazwy. Nadanie nazwy danemu apletowi musi się odbyć w kodzie HTML w jeden z następujących sposobów:

Poniżej zamieszczono dwa aplety ilustrujące ideę wyszukiwania przez podanie nazwy. Pierwszy aplet, Sender (Nadawca), szuka drugiego apletu, Receiver (Odbiorca). Kiedy Nadawca znajdzie Odbiorcę, wysyła komunikat do Odbiorcy przez wywołanie jednej z metod Odbiorcy ( z podaniem nazwy Nadawcy jako argument). Odbiorca reaguje na ten komunikat przez zmianę tekstu na "Received message from sender-name!".


Działanie: Naciśnij przycisk Send message na górze apletu(to jest Sender). W oknie tekstowym tego apletu pojawi się kilka informacji o wykonanych czynnościach, oraz Receiver potwierdzi (przez wyświetlenie własnego komunikatu) otrzymanie wiadomości. Po przeczytaniu potwierdzenia wyświetlonego przez aplet Receiver, naciśnij przycisk Clear, aby przywrócić stan pierwotny dla apletu Receiver. W polu tekstowym apletu Sender z etykietą "Receiver name:," wpiszbuddy i naciœnij Enter. Ponieważ "buddy" jest własną nazwą Nadawcy, znajdzie on aplet tak nazwany, ale nie prześle komunikatu, gdyż nie jest to aplet typu Receiver.

Tu zamieszczono cały kod apletu Sender. Część kodu odpowiadającą za wyszukanie i komunikację z apletem typu Receiver zamieszczono poniżej. Kodu pogrubionego można użyć bez zmian w innych apletach.

Applet receiver = null;
String receiverName = nameField.getText(); //Get name to search for.
receiver = getAppletContext().getApplet(receiverName);
Aplet Sender upewnia się, czy odnaleziono aplet o nazwie Receiver i czy jest on instancją właściwej klasy - (Receiver). Jeśli wszystko jest w porządku, Sender wysyła komunikat do apletu Receiver. (Tu zamieszczono kod apletu Receiver.)
if (receiver != null) {
    //Use the instanceof operator to make sure the applet
    //we found is a Receiver object.
    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");
        //Cast the receiver to be a Receiver object
        //(instead of just an Applet object) so that the
        //compiler will let us call a Receiver method.
        ((Receiver)receiver).processRequestFrom(myName);
    }
} . . .

Nazwa apletu jest przechowywana w parametrze NAME. Wartość tego parametru można otrzymać przy pomocy metody Applet getParameter. Na przykład, Sender czyta swoją nazwę w tym fragmencie kodu:

myName = getParameter("NAME");

Pokazany wyżej układ apletów umożliwia jedynie jednostronną komunikację - od apletu Sender do apletu Receiver. Aby umożliwić apletowi Receiver wysyłanie komunikatów do apletu Sender, aplet Sender musi przekazać apletowi Receiver wskazanie na siebie samego (this). Na przykład:

((Receiver)receiver).startCommunicating(this);
Tę dwustronną komunikację realizuje nieco zmodyfikowany układ apletów. Warto zauważyć, że pierwszym krokiem zawsze musi być wysłanie wiadomości przez aplet Nadawca. Bez tej poczštkowej wiadomości niemożliwe jest udzielanie odpowiedzi.

Tu zamieszczono kod apletu Sender2, a tu - apletu Receiver2.

Znajdowanie wszystkich apletów na stronie. Metoda getApplets

Metoda getApplets zwraca listę (typu Enumeration) wszystkich apletów znajdujących się na stronie. Ze względów bezpieczeństwa wiele przeglądarek implementuje metodę getApplets w ten sposób, że zwraca ona tylko te aplety, które pochodzą z tego samego serwera co aplet wywołujący metodę getApplets. Poniżej umieszczono aplet wyświetlający listę wszystkich apletów na tej stronie:

Poniżej przedstawiono część kodu z wywołaniem metody getApplets (Tu znajduje się kod całego programu.)

public void printApplets() {
    //Enumeration will contain all applets on this page (including
    //this one) that we can send messages to.
    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");
        } 
    }
    . . . 
}