Condividi tramite


Chat del canale peer

Nell'esempio di chat viene illustrato come implementare un'applicazione di chat a più parti utilizzando il canale peer. I messaggi inviati da qualsiasi istanza di un'applicazione di chat vengono ricevuti da tutte le altre istanze.

L'esempio di chat non è basato sui concetti di client e servizio. È una vera applicazione peer-to-peer in cui ogni istanza svolge la funzione di peer delle altre istanze. Ogni istanza può infatti inviare messaggi alle altre istanze e ricevere messaggi da queste utilizzando il contratto duplex IChat.

Questo esempio è basato sull'esempio Servizio indipendente. Fare riferimento anche a Esempio della guida introduttiva per una panoramica dettagliata di Windows Communication Foundation (WCF).

Nota

La procedura di installazione e le istruzioni di compilazione per questo esempio si trovano alla fine dell'argomento.

Concetti chiave:

Il canale peer è una tecnologia di comunicazione peer-to-peer (P2P) a più parti disponibile in WCF. Fornisce un canale di comunicazione P2P basato su messaggi sicuro e scalabile per gli sviluppatori di applicazioni. Un esempio comune di applicazione a più parti che può trarre profitto da un canale peer è rappresentato da applicazioni collaborative, ad esempio chat, in cui un gruppo di persone parla con uno altro gruppo in modo peer-to-peer senza bisogno di server. Il canale peer consente la collaborazione P2P, la distribuzione di contenuti, il bilanciamento del carico e l'elaborazione distribuita per scenari aziendali e relativi a utenti.

Con il canale peer vengono introdotti i seguenti nuovi concetti:

  • Una mesh è un insieme denominato (un grafico interconnesso) di nodi peer che possono comunicare fra loro e sono tutti identificati da un ID mesh univoco.

    Nota

    I nodi attivi nella rete mesh pubblicano i rispettivi nomi di rete mesh in modo da poter essere individuati dagli altri nodi. Una rete mesh si adatta alle modifica di appartenenza, dispone di una connettività adattabile in un ambiente in cui i nodi si collegano e si scollegano continuamente dalla rete mesh ed è ottimizzata dinamicamente in base ai diversi modelli di traffico.

  • Un nodo Peer rappresenta un endpoint in una rete mesh. Una singola applicazione può avere anche più nodi peer che partecipano a reti diverse.

  • Un resolver Peer è responsabile della risoluzione dell'ID di una rete mesh negli indirizzi endpoint dei nodi della rete mesh. Questi indirizzi vengono utilizzati da un nodo Peer per connettere altri nodi della rete mesh. In tal modo, è possibile la propagazione dei messaggi in tutta la rete mesh.

La chat è un'applicazione console. Ogni istanza di un'applicazione di chat crea una classeIDuplexChannel con lo stesso indirizzo endpoint. Quindi, un messaggio inviato da un'istanza dell'applicazione chat viene ricevuto da tutte le altre istanze del relativo canale Peer, poiché tutte le istanze utilizzano lo stesso indirizzo.

L'applicazione di chat definisce e implementa il contratto duplex IChat. Il contratto IChat consente solo operazioni unidirezionali perché ServiceModel non supporta il paradigma richiesta singola-risposte multiple (nel caso di un canale pluripartito, una richiesta singola inviata alla mesh può generare più risposte).

Questo esempio implementa una funzione main statica per creare una classe IClientChannelcon un contratto duplexIChat, utilizzando l'endpoint specificato nel file di configurazione.

Le istanze di chat devono utilizzare tutte lo stesso indirizzo endpoint per assicurare che i messaggi inviati da un'istanza vengano ricevuti da tutte le altre.

Le istanze di chat di questo esempio si individuano reciprocamente utilizzando un resolver personalizzato o il resolver Peer predefinito (PNRP). Il PNRP non è disponibile in Windows Server 2003. Pertanto, è necessario utilizzare un resolver personalizzato per eseguire questo esempio in un sistema su cui è in esecuzione Windows Server 2003. Per impostazione predefinita, l'esempio viene configurato per l'utilizzo di un resolver personalizzato. L'utilizzo di un resolver personalizzato o del resolver predefinito viene determinato dall'endpoint di chat definito nel file di configurazione riportato di seguito. Per passare al resolver Peer predefinito (PNRP), sostituire "BindingCustomResolver" con "BindingDefault" all'interno di bindingConfiguration nel file di configurazione dell'esempio.

<!-- chat instance participating in the mesh -->
         <endpoint name="ChatEndpoint"
                   address="net.p2p://chatMesh/ServiceModelSamples/Chat" 
                   binding="netPeerTcpBinding" 
                   bindingConfiguration="BindingCustomResolver" 
                   contract="Microsoft.ServiceModel.Samples.IChat">
         </endpoint>

Per consentire al nodo Peer di comunicare con il servizio Resolver peer personalizzato del canale peer, la configurazione sul lato client di Resolver peer personalizzato del canale peer viene definita nel file di configurazione.

<!-- Client used to communicate with the custom resolver service. -->
<client>
<endpoint configurationName="CustomPeerResolverEndpoint"
address="net.tcp://localhost/ServiceModelsamples/peerResolverService"
    binding="netTcpBinding"
    bindingConfiguration="Binding3"
    contract="Microsoft.ServiceModel.SamplesICustomPeerResolver">
</endpoint>
</client>

L'indirizzo identifica quello del servizio resolver. Se il servizio resolver è in esecuzione su un computer remoto, sostituire localhost con un nome di dominio completo.

Nell'esempio viene illustrato anche come recuperare il nodo Peer daIClientChannel e come registrarsi per gli eventi in linea e non in linea utilizzando IOnlineStatus. Un evento in linea viene generato quando il nodo Peer è connesso ad almeno un altro nodo Peer nella rete mesh. Un evento non in linea viene generato, invece, quando il nodo Peer non è più connesso ad altri nodi Peer nella rete mesh.

Attualmente, non è possibile generare metadati poiché un canale Peer non è integrato con l'utilità dei metadati del servizio (Svcutil.exe).

Quando si esegue l'esempio, i messaggi di chat inviati da un'istanza di chat vengono visualizzati nelle finestre della console di altre istanze di chat. Premere il tasto Q seguito da INVIO in ogni finestra della console per chiudere l'istanza.

Nota

L'esempio attualmente non gestisce tutte le eccezioni che possono essere generate dall'infrastruttura. Se si utilizzano questi esempi in un ambiente commerciale o di produzione, seguire le procedure consigliate per una corretta gestione delle eccezioni.

Per impostare, compilare ed eseguire l'esempio

  1. Assicurarsi di aver eseguito Procedura di installazione singola per gli esempi di Windows Communication Foundation.

  2. Per compilare l'edizione in C# o Visual Basic .NET della soluzione, seguire le istruzioni in Generazione degli esempi Windows Communication Foundation.

  3. Per eseguire l'esempio su una configurazione con un solo computer o tra computer diversi, seguire le istruzioni in Esecuzione degli esempi di Windows Communication Foundation.

  4. Inoltre, per l'esempio della chat, si applicano i passaggi seguenti. Quando un passaggio fa riferimento a un client o a un servizio, tale passaggio si applica a istanze separate dell'esempio (poiché l'esempio di chat non rappresenta un'applicazione di un client o di un servizio).

  5. Se bindingConfiguration è impostato su BindingDefault, assicurarsi che PNRP sia installato e attivo su tutti i computer utilizzati. Se bindingConfiguration viene impostato su BindingCustomResolver, verificare che il servizio resolver personalizzato nella directory Chat\<lingua>\CustomerResolver\bin della directory Chat project/solution venga avviato in tutti i computer in uso.

  6. Avviare tante istanze dell'applicazione quante si desiderano. Iniziare con l'immissione di un nome alternativo che distinguerà i messaggi inviati da una determinata istanza del client. Subito dopo l'immissione del nome, è possibile inviare i messaggi di chat alla rete mesh. Questi messaggi devono essere restituiti a tutte le altre istanze con un nome del membro distinto (ovvero, un messaggio di un client con lo stesso nome non sarà visualizzato e il proprio messaggio di un solo client non verrà restituito alla console).

Send comments about this topic to Microsoft.
© 2007 Microsoft Corporation. All rights reserved.