Nel precedente
articolo abbiamo introdotto l'approccio
Comet e una sua
implementazione per
GWT, da questo articolo in poi, invece utilizzeremo questi elementi per poter realizzare una semplice chat.
Per prima cosa dovremo stabilire i servizi utilizzati dal client per poter comunicare in chat. Tali servizi verranno effettivamente implementati nel prossimo articolo. Nel dettaglio definiremo questi servizi come un'interfaccia, denominata
ChatService, in cui definiamo i servizi di
login,
logout,
send e il servizio
getUsername, indispensabile per controllare se la sessione di chat iniziata al momento del login è ancora attiva oppure no. Di seguito diamo il codice dell'interfaccia appena descritta.
public interface ChatService extends RemoteService {
public String getUsername() throws ChatException;
public void login(String username) throws ChatException;
public void logout(String username) throws ChatException;
public void send(String message) throws ChatException;
}
A questo punto possiamo cominciare a costruire l'
entryPoint ChatEntryPoint, che rappresenterà il front-end della chat e a cui dedicheremo l'intero articolo. I compiti principali di
ChatEntryPoint sono essenzialmente due: instaurare e gestire una comunicazione con il server, utilizzando un'istanza della classe
CometClient; acquisire e stampare sullo schermo tutti i messaggi che intercorrono nella comunicazione.
Tralasciando quest'ultima parte, vediamo le parti salienti dell'instaurazione della comunicazione con il server. Partendo da
ChatEntryPoint, si può vedere nel codice riportato sotto che al caricamento dell'applicazione, si effettua la verifica immediata della presenza di una sessione di comunicazione già attiva, attraverso il richiamo del servizio
getUsername; in caso contrario si procederà ad aprire la finestra per effettuare il login.
...
public class ChatEntryPoint implements EntryPoint {
private ChatServiceAsync chatService;
private CometClient cometClient;
private String username;
...
@SerialTypes( { ChatMessage.class}) public static abstract class ChatCometSerializer extends CometSerializer { }
//Stampa di un messaggio ricevuto
public void output(String text, String color) {...} //Finestra di dialogo per il login
private void showLogonDialog() {...}
public void onModuleLoad() { chatService = GWT.create(ChatService.class);
chatService.getUsername(new AsyncCallback<String>() {
public void onSuccess(String username) { if (username == null) { showLogonDialog();
}
else { loggedOn(username);
}
}
public void onFailure(Throwable caught) { output(caught.toString(), "red");
showLogonDialog();
}
});
...
Inoltre con l'annotazione
@SerialType e la definizione della classe astratta
ChatCometSerializer, definiamo quali sono i messaggi inviati dal server (nel nostro caso
ChatMessage) che vogliamo
serializzare in modo da utilizzarli allo stesso modo anche nel client. Di seguito, è riportato il codice necessario per l'invio di un messaggio verso il server e per il logout.
...
final TextBox input = new TextBox();
Button send = new Button("Send", new ClickHandler() {
public void onClick(ClickEvent event) { sendMessage(input.getValue());
}
});
Button logout = new Button("Logout", new ClickHandler() {
public void onClick(ClickEvent event) { logout();
}
});
...
}
...
Il codice seguente invece è relativo al metodo
sendMessage, che effettua la chiamata all'omonimo servizio posto sul server:
...
private void sendMessage(String message) { chatService.send(message, new AsyncCallback<Void>() {
public void onSuccess(Void result) {}
public void onFailure(Throwable caught) { output(caught.toString(), "red");
}
});
}
....