Una chat P2P con Windows Communication Foundation

di Cristian Civera, in Windows Communication Foundation,

Windows Communication Foundation è un framework molto completo e il suo punto di forza è basato sul fatto che indipendentemente dal tipo di messaggio o dall'insfrastruttura di sicurezza che si vuole usare, è in grado di variare nel mezzo di trasporto con cui viaggiano i messaggi.
E' infatti disponibile una tipologia di Binding di nome netPeerTcpBinding che permette di far comunicare una serie di nodi tra di loro senza l'ausilio di un server centrale. Questo vuol dire che grazie alle funzionalità di callback di WCF, ogni messaggio (un'operazione) che un peer manda, viene inviato a se stesso e anche agli altri peer della stessa cloud (gruppo di peer). In questo script si crea quindi una chat basata su questo meccanismo definendo, come è solito fare, l'interfaccia rappresentante le operazioni che si vogliono supportare:

[ServiceContract(Namespace = "http://schemas.winfxitalia.com/Chat", CallbackContract = typeof(IChat))]
public interface IChat
{
    [OperationContract(IsOneWay = true)]
    void Login(string name);

    [OperationContract(IsOneWay = true)]
    void Logout(string name);

    [OperationContract(IsOneWay = true)]
    void Chat(string name, string message);
}

Occorre poi implementare quest'interfaccia per far sì che ogni utente nella chat riceva i propri e i messaggi altrui, oltre alle notifiche di entrata ed uscita degli utenti:

void IChat.Login(string name)
{
    Console.WriteLine("{0} has logged in", name);
}

void IChat.Logout(string name)
{
    Console.WriteLine("{0} has logged out", name);
}

void IChat.Chat(string name, string message)
{
    Console.WriteLine("{0}: {1}", name, message);
}

Come solito in WCF, occorre poi configurare il servizio nel file .config per indicare che il servizio utilizza il netPeerTcpBinding indicando qual è il resolver utilizzato per individuare i peer. Si tratta di un'importante componente che mantiene la lista dei peer associati ad ogni cloud. Il tipo Pnrp utilizza una funzionalità di Windows che si basa su un server centrale gestito da Microsoft.

<system.serviceModel>
  <client>
    <endpoint name="ChatService"
      address="net.p2p://winfxitalia/Chat"
      binding="netPeerTcpBinding"
      bindingConfiguration="chatBinding"
      contract="PeerChat.IChat">
    </endpoint>
  </client>
  <bindings>
    <netPeerTcpBinding>
      <binding name="chatBinding" port="0">
        <security mode="None" />
        <resolver mode="Pnrp" />
      </binding>
    </netPeerTcpBinding>
  </bindings>
</system.serviceModel>

Infine, occorre creare il canale e utilizzare l'interfaccia per mandare e notificare l'entrata e l'uscita dell'utente:

// Creo il factory per la creazione del canale
// Utilizza la classe stessa come implementazione del callback
DuplexChannelFactory<IChatChannel> factory = new DuplexChannelFactory<IChatChannel>(this, "ChatService");
// Creo il canale
chatChannel = factory.CreateChannel();
// Apro il canale di comunicazione
chatChannel.Open();

Console.Write("Insert user name: ");
string userName = Console.ReadLine();

// Inizio lo scambio di messaggi
chatChannel.Login(userName);

string msg;
while ((msg = Console.ReadLine()).Length > 0)
{
    chatChannel.Chat(userName, msg);
}

chatChannel.Logout(userName);

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

Nessuna risorsa collegata

I più letti di oggi