In questo contributo sarà illustrato come creare e gestire la comunicazione con il server, tramite un'apposita classe della
libreria che implementa la metodologia
Comet, denominata
CometClient, che rende invisibile al programmatore la scelta (decisione che viene presa in base al browser su cui viene eseguita la classe) della tecnica utilizzata per realizzare una
comunicazione full duplex tra browser e web server.
Iniziamo dal metodo
login, che richiama l'omonimo servizio; in caso di avvenuta connessione passiamo a richiamare il metodo
loggedOn, che racchiude un po' il cuore di tutta la comunicazione, dato che ci consente di inizializzare e avviare una istanza di
CometClient e iniziare così l'effettiva comunicazione con il server.
...
private void login(final String username) { chatService.login(username, new AsyncCallback<Void>() {
public void onSuccess(Void result) { loggedOn(username);
}
public void onFailure(Throwable caught) { output(caught.toString(), "red");
}
});
}
...
In particolare, il metodo
loggedOn, riportato qui sotto, crea una istanza
CometSerializer utilizzando la classe astratta descritta in precedenza, e successivamente crea il
CometClient passandogli l'indirizzo del server, il serializzatore appena creato e un
CometListener, che gestisce tutti gli eventi possibili che possono avvenire durante la comunicazione.
private void loggedOn(String username) { this.username = username;
output("logged in as " + username, "silver"); CometSerializer serializer = GWT.create(ChatCometSerializer.class);
cometClient = new CometClient(GWT.getModuleBaseURL() + "comet", serializer, new CometListener() { public void onConnected(int heartbeat) { output("connected " + heartbeat, "silver"); }
public void onDisconnected() { output("disconnected", "silver"); }
public void onError(Throwable exception, boolean connected) { output("error " + connected + " " + exception, "red"); }
public void onHeartbeat() { output("heartbeat", "silver"); }
public void onRefresh() { output("refresh", "silver"); }
public void onMessage(List<? extends Serializable> messages) { for (Serializable message : messages) { if (message instanceof ChatMessage) { ChatMessage chatMessage = (ChatMessage) message;
output(chatMessage.getUsername() + ": " + chatMessage.getMessage(), "black");
}
else { output("unrecognised message " + message, "red"); }
}
}
});
cometClient.start();
}
Concludiamo questa parte riportando qui sotto, il codice del
metodo logout, che si occupa essenzialmente di gestire la chiusura dell'istanza di
CometClient.
...
private void logout() { chatService.logout(username, new AsyncCallback<Void>() {
public void onSuccess(Void result) { cometClient.stop();
showLogonDialog();
}
public void onFailure(Throwable caught) { output(caught.toString(), "red");
}
});
}
}