2009-07-06 7 views
6

Ich verwende WCF in .NET 3.5, um eine Peer-to-Peer-Netzwerkanwendung zu implementieren. Um Peer-Knoten zu lösen, verwende ich PNRP. wie untenWCF Peer to Peer, gibt es Knoten da draußen?

IGlobalStoreServiceContract ist mein Vertrag gezeigt,

[ServiceContract(Namespace = "http://GlobalStoreEventDriven.API", CallbackContract = typeof(IGlobalStoreServiceContract))] 
internal interface IGlobalStoreServiceContract 
{ 
    [OperationContract(IsOneWay = true)] 
    void NotifyGlobalStoreDataInserted(string globalGroup, DateTime maxDateTime); 

    [OperationContract(IsOneWay = true)] 
    void RegisterNode(); 

    [OperationContract(IsOneWay = true)] 
    void SynchronizeMemberList(Guid clientId); 
} 

ich so etwas Code bin mit jedem Knoten zu dem Peer-to-Peer-Netzwerk beizutreten.

Meine Frage ist, sobald ich den Kanal geöffnet habe, wie kann ich am besten sagen, ob andere Peer-Knoten im Netzwerk sind?

Zum Beispiel konnte ich eine der Methoden in meinem Vertrag RegisterNode nennen, und jeder Knoten im Netzwerk einen Rückruf verwenden könnte SynchronizeMemberList zu nennen. Ich würde dann wissen, ob andere Knoten da waren.

Das Problem mit diesem ist es asynchron ist. Wenn ich RegisterNode anrufe und niemand antwortet, bedeutet das nicht, dass niemand da ist, es könnte nur bedeuten, dass ich nicht lange genug gewartet habe.

Was meinst du? Irgendwelche Vorschläge?

Antwort

5

Siehe Peer-to-Peer Programming with WCF and .NET Framework 3.5: Peer Name von Amit Bahree und Chris Peiris:

Der letzte logische Schritt nach Erstellung und Veröffentlichung ein Peer eine Peer Lösung. Was nützt es, etwas in die Cloud zu veröffentlichen, wenn eine andere Peer nicht finden können? Wir verwenden die PeerNameResolver Klasse für einen bestimmten Peer in einer bestimmten Wolke zu lösen. Die PeerNameResolver kann einen Peer zu entweder PeerRecord oder eine Wolke, abhängig von den Parametern auflösen, die übergeben werden. Der Auflösungsprozess endet entweder, wenn die maximale Anzahl von Einträge für die PeerRecordCollection erreicht ist oder , wenn es das Ende von verschiedenen Wolken erreicht hat.

Die PeerNameResolver Klasse stellt eine überladene Methode mit dem Namen Resolve dar und wird verwendet, um einen bestimmten Peer synchron aufzulösen.

Listing 17 zeigt uns, wie zu versuchen, für einen Peer zu lösen, die MySecurePeer genannt wird. Die Resolve-Methode gibt eine Auflistung vom Typ PeerNameRecordCollection zurück, durch die wir iterieren. Listing 18 zeigt das Ergebnis auf einem Computer mit drei Netzwerkkarten.

PeerName myPeer = new PeerName("MySecurePeer", PeerNameType.Secured); 
PeerNameResolver resolver = new PeerNameResolver(); 

PeerNameRecordCollection results = resolver.Resolve(myPeer); 

Console.WriteLine("{0} Peers Found:", results.Count.ToString()); 
int i = 1; 

foreach (PeerNameRecord peer in results) 
{ 
    Console.WriteLine("{0} Peer:{1}", i++, peer.PeerName.ToString()); 
    foreach (IPEndPoint ip in peer.EndPointCollection) 
    { 
     Console.WriteLine("\t Endpoint: {0}", ip.ToString()); 
    } 
} 

Also, ich denke Sie PeerNameResolver.Resolve Method sollten überprüfen:

Diese Methode assoziierte Namen zu Wolken spähen. die PeerNameResolver Methode aufrufen ähnelt die Resolve Methode für jeden Peer Name Datensatz in der PeerNameRecordCollection zu nennen.Beachten Sie, dass mit der Methode auf einen einzelnen Peer-Namen-Datensatz nicht Namen ungültig lösen.

Für jede Methode gibt es eine äquivalente ResolveAsync Methode. Sie sind identisch in den Parametern, die sie übergeben werden, mit der Ausnahme, dass die ResolveAsync Methode enthält ein System Token in seiner Parameterliste für asynchrone Ereignisbehandlung.