Freigeben über


Peerkanalchat

Das Chatbeispiel veranschaulicht das Implementieren einer Mehrparteien-Chatanwendung mit einem Peerkanal. Von einer Instanz einer Chatanwendung gesendete Nachrichten werden von allen anderen Instanzen empfangen.

Das Chatbeispiel basiert nicht auf dem Begriff von Client und Dienst. Es ist eine echte Peer-to-Peer-Anwendung, bei der jede Instanz als Peer anderer Instanzen fungiert. Mithilfe des IChat-Duplexvertrags kann jede Instanz Nachrichten an andere Instanzen senden oder von ihnen empfangen.

Das Chatbeispiel basiert auf dem Beispiel Selbst gehostete Dienste. Eine allgemeine Übersicht über Windows Communication Foundation (WCF) finden Sie auch unter Beispiel 'Erste Schritte'.

Tipp

Die Setupprozedur und die Erstellungsanweisungen für dieses Beispiel befinden sich am Ende dieses Themas.

Grundbegriffe:

Peerkanal ist eine Mehrparteien-, P2P-Kommunikationstechnologie (Peer-to-Peer) in WCF. Er stellt einen sicheren und skalierbaren nachrichtenbasierten P2P-Kommunikationschannel für Anwendungsentwickler bereit. Ein allgemeines Beispiel einer Mehrparteienanwendung, die von Peerkanal profitieren kann, sind gemeinschaftliche Anwendungen, wie beispielsweise Chat, wo eine Gruppe von Benutzern direkt miteinander kommunizieren kann, ohne dass Server erforderlich sind. Peerkanal ermöglicht P2P-Zusammenarbeit, Inhaltsverteilung, Lastenausgleich und verteilte Verarbeitung sowohl bei Consumer- als auch Unternehmensszenarios.

Bei Peerkanal gibt es die folgenden neuen Begriffe:

  • Ein Netz ist eine benannte Auflistung (ein verbundenes Diagramm) von Peerknoten, die untereinander kommunizieren können und durch eine eindeutige Netz-ID gekennzeichnet sind.

    Tipp

    Aktive Knoten im Netz veröffentlichen ihren Netznamen, sodass andere sie finden können. Ein Netz besitzt die folgenden Merkmale: Wenn Knoten dem Netz beitreten oder es verlassen, passt es sich an, hält dabei eine belastbare Konnektivität aufrecht und wird gemäß der aktuellen Datenverkehrsmuster dynamisch optimiert.

  • Ein Peerknoten ist ein Endpunkt in einem Netz. Eine einzelne Anwendung kann auch über mehrere Peerknoten verfügen, die an anderen Netzen teilnehmen.

  • Ein Peerresolver dient zum Auflösen einer Netz-ID in die Endpunktadressen der Knoten im Netz. Ein Peerknoten verwendet diese Adressen, um Verbindungen zu anderen Knoten im Netz herzustellen. Auf diese Weise können Nachrichten über das Netz weitergegeben werden.

Beim Chat handelt es sich um eine Konsolenanwendung. Jede Instanz einer Chatanwendung erstellt einen IDuplexChannel mit der gleichen Endpunktadresse. Daher wird eine Nachricht, die von einer Instanz einer Chatanwendung in ihrem Peerkanal gesendet wird, von allen anderen Instanzen empfangen, da sie alle die gleiche Adresse verwenden.

Die Chatanwendung definiert und implementiert den IChat-Duplexvertrag. Der IChat-Vertrag lässt nur unidirektionale Vorgänge zu, da das ServiceModel nicht das Paradigma "einzelne Anforderungen, mehrere Antworten" unterstützt (im Falle eines Mehrparteienkanals handelt es sich um eine einzelne an das Netz gesendete Anforderung, die mehrere Antworten generiert).

Dieses Beispiel implementiert eine statische Hauptfunktion, um einen IClientChannel mit dem IChat-Duplexvertrag zu erstellen und den in der Konfigurationsdatei angegebenen Endpunkt zu verwenden.

Alle Chatinstanzen müssen die gleiche Endpunktadresse verwenden, um sicherzustellen, dass die von einer Instanz gesendeten Nachrichten von allen anderen Instanzen empfangen werden.

Die Chatinstanzen in diesem Beispiel finden einander entweder mithilfe eines benutzerdefinierten Resolvers oder mithilfe des Standardpeerresolvers (PNRP). Beachten Sie, dass PNRP in Windows Server 2003 nicht verfügbar ist. Daher muss zum Ausführen dieses Beispiels unter Windows Server 2003 ein benutzerdefinierter Resolver verwendet werden, was bei diesem Beispiel standardmäßig der Fall ist. Ob ein benutzerdefinierter oder der Standardresolver verwendet wird, wird vom Chatendpunkt in der folgenden Konfigurationsdatei definiert. Um zum Standardpeerresolver (PNRP) zu wechseln, ersetzen Sie "BindingCustomResolver" durch "BindingDefault" unter "bindingConfiguration" in der Konfigurationsdatei des Beispiels.

<!-- 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>

Damit der Peerknoten mit dem Benutzerdefinierter Peerkanal-Peerresolver-Dienst kommunizieren kann, wird die clientseitige Konfiguration von Benutzerdefinierter Peerkanal-Peerresolver in der Konfigurationsdatei definiert.

<!-- 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>

Die Adresse bezeichnet die Adresse des Resolverdiensts. Wenn der Resolverdienst auf einem Remotecomputer ausgeführt wird, ersetzen Sie localhost durch einen qualifizierten Domänennamen.

Das Beispiel zeigt auch, wie der Peerknoten von IClientChannel abgerufen wird und wie die Registrierung für dessen Online- und Offlineereignisse mithilfe von IOnlineStatus erfolgt. Ein Onlineereignis wird initiiert, wenn der Peerknoten eine Verbindung mit mindestens einem anderen im Mesh befindlichen Peerknoten herstellt. Ein Offlineereignis wird initiiert, wenn der Peerknoten mit keinem anderen im Mesh befindlichen Peerknoten mehr verbunden ist.

Derzeit können Metadaten nicht generiert werden, da im Metadaten-Hilfsprogramm des Diensts (Svcutil.exe) kein Peerkanal integriert ist.

Beim Ausführen des Beispiels werden die von einer Chatinstanz gesendeten Chatmeldungen in den Konsolenfenstern der anderen Chatinstanzen angezeigt. Drücken Sie in den einzelnen Konsolenfenstern die Taste "Q", gefolgt von der EINGABETASTE, um die Instanz zu schließen.

Tipp

Derzeit werden nicht alle möglichen Ausnahmen, die die Infrastruktur u. U. auslöst, vom Beispiel verarbeitet. Wenn Sie diese Beispiele in einer kommerziellen oder Produktionsumgebung verwenden, folgen Sie bitte den bewährten Methoden zur korrekten Ausnahmebehandlung.

So richten Sie das Beispiel ein, erstellen es und führen es aus

  1. Stellen Sie sicher, dass Sie Beispiele zum einmaligen Setupverfahren für Windows Communication Foundation ausgeführt haben.

  2. Zum Erstellen der C#- oder Visual Basic .NET-Edition der Projektmappe befolgen Sie die unter Erstellen der Windows Communication Foundation-Beispiele aufgeführten Anweisungen.

  3. Wenn Sie das Beispiel in einer Konfiguration mit einem Computer oder computerübergreifend ausführen möchten, folgen Sie den unter Durchführen der Windows Communication Foundation-Beispiele aufgeführten Anweisungen.

  4. Darüber hinaus gelten für das Chatbeispiel die folgenden Schritte. Wenn in diesem Beispiel in Schritt 3 von Client und Dienst die Rede ist, sind damit separate Instanzen des Beispiels gemeint, da im Chatbeispiel keine Clients oder Dienste vorkommen.

  5. Wenn bindingConfiguration auf "BindingDefault" festgelegt wird, stellen Sie sicher, dass auf allen verwendeten Computern PNRP installiert und aktiviert ist. Stellen Sie sicher, falls bindingConfiguration auf BindingCustomResolver festgelegt ist, dass der benutzerdefinierte Auflösungsdienst im Verzeichnis Chat\<Sprache>\CustomerResolver\bin des Chat-Verzeichnisses "Projekt/Projektmappe" auf allen verwendeten Computern gestartet wird.

  6. Starten Sie so viele Instanzen der Anwendung, wie Sie möchten. Beginnen Sie damit, dass Sie einen Spitznamen eingeben, mit dem von einer besonderen Clientinstanz gesendete Nachrichten unterschieden werden. Kurz nachdem dieser Name eingegeben wurde, können Chatnachrichten ans Netz gesendet werden. Diese Nachrichten werden in den anderen Instanzen mit einem eindeutigen Membernamen wiedergegeben (d. h. eine Nachricht von einem Client mit dem gleichen Namen wird nicht angezeigt, und die eigene Nachricht eines Clients wird nicht in seiner Konsole wiedergegeben).

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