Costruire una chat con Windows Communication Foundation

6 pagine in totale: <<Indietro 1 2 3 [4] 5 6 Avanti >>

Il secondo metodo da implementare è SendMessage che deve semplicemente inviare a tutti i client connessi i messaggi in arrivo.

public void SendMessage(string nick, string message) {
    ChatEventArgs e = new ChatEventArgs();
    e.message = message;
    e.name = name;
    e.msgType = MessageType.SendMessage;
    BroadcastMessage(e);
}

Questo metodo è abbastanza banale in quanto deve solo impacchettare i dati del messaggio nella solita istanza della classe ChatEventArgs e passarla al metodo BroadcastMessage.

Il terzo ed ultimo metodo è SignOut che notifica i vari client della disconnessione di un utente.

public void SignOut(string nick) {
    lock (synchronize) {
        chatters.Remove(nick);
    }
    ChatEvent -= myEventHandler;
    ChatEventArgs e = new ChatEventArgs();
    e.msgType = MessageType.SignOut;
    e.name = name;
    BroadcastMessage(e);
}

Anche in questo caso, il metodo è alquanto banale in quanto deve accedere alla lista degli utenti in maniera Thread-Safe (cioè preoccupandosi di acquisire il lock sulla risorsa) ed eliminare l'utente dalla lista. Successivamente il passo sarà semplicemente quello di impacchettare i dati e spedirli con la solita procedura vista negli snippet precedenti.

Per completezza è bene fare una veloce analisi dei metodi che gestiscono fisicamente il callback verso i vari client BroadcastMessage e ChatEventHandler.

private void BroadcastMessage(ChatEventArgs e) {
    ChatEventHandler tmp = ChatEvent;
    if (tmp != null) {
        foreach (ChatEventHandler handler in tmp.GetInvocationList()) {
        handler.BeginInvoke(this, e, new AsyncCallback(EndAsync), null);
        }
    }
}

private void ChatEventHandler(object sender, ChatEventArgs e) {
    try {
        switch (e.msgType) {
            case MessageType.SendMessage:
                callback.ReceiveMessage(e.message);
                break;
            case MessageType.SignIn:
                callback.SignIn(e.name);
                break;
            case MessageType.SignOut:
                callback.SignOut(e.name);
                break;
        }
    }
    catch {
        Leave(e.name);
    }
}

BroadcastMessage sfrutta il metodo GetInvocationList, ereditato dalla classe MulticastDelegate, per ottenere tutti i delegati sottoscritti ad un determinato evento. Successivamente, in maniera asincrona, questi delegati vengono invocati uno ad uno.

Il metodo ChatEventHandler corrisponde al delegato invocato dal metodo BroadcastMessage e semplicemente invia il messaggio sfruttando il canale di callback che è stato aperto quando ogni utente ha eseguito il SignIn.

6 pagine in totale: <<Indietro 1 2 3 [4] 5 6 Avanti >>

Attenzione: Questo articolo contiene un allegato

Contenuti dell'articolo

Commenti
Dai un voto a questo articolo, ci aiuterà a migliorare il nostro sito (1 è il voto minimo, 5 il massimo).

Per procedere al rating dell'articolo devi essere autenticato.
novecento scrive:
Costruire una chat con Windows Communication Foundation

ciao Stefano, bell'articolo, molto interessante l'invocazione asincrona dei delegati sottoscritti all'evento.- C'é un motivo per cui non hai usato la ...
mercoledì 7 febbraio 2007

Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.



TUTORIALS


IN EVIDENZA
MISC