2009-07-06 11 views
6

Estoy usando WCF en .NET 3.5 para implementar una aplicación de red de igual a igual. Para resolver nodos pares, estoy usando PNRP.WCF Peer to Peer, ¿Hay nodos por ahí?

IGlobalStoreServiceContract es mi contrato como se muestra a continuación,

[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); 
} 

estoy usando un código como este para unirse a cada nodo de la red punto a punto.

DuplexChannelFactory<IGlobalStoreChannel> channelFactory = new DuplexChannelFactory<IGlobalStoreChannel>(instance, "GlobalStoreAPIEndPoint"); 
IGlobalStoreChannel globalStoreChannel = channelFactory.CreateChannel(); 

globalStoreChannel.Open(); 

Mi pregunta es tan pronto como abro el canal, ¿cómo puedo saber si hay otros nodos iguales en la red?

Por ejemplo, podría llamar a uno de los métodos en mi contrato RegisterNode, y cada nodo en la red podría usar una devolución de llamada para llamar a SynchronizeMemberList. Entonces sabría si otros nodos estaban allí.

El problema es que es todo asíncrono. Si llamo a RegisterNode y nadie responde, realmente no significa que no haya nadie allí, solo podría significar que no esperé lo suficiente.

¿A qué te refieres? ¿Alguna sugerencia?

Respuesta

5

Ver Peer-to-Peer Programming with WCF and .NET Framework 3.5: Peer Name por Amit Bahree y Chris Peiris:

El paso lógico final después de la creación de y la publicación de un compañero está resolviendo un par . ¿De qué sirve publicar algo en la nube si otro interlocutor no puede encontrarlo? Usamos la clase PeerNameResolver para resolver por un par específico en una nube determinada. El PeerNameResolver puede resolver un par ya sea un PeerRecord o una nube, según los parámetros que están aprobados. El proceso de resolución finaliza cuando se alcanza el número máximo de entradas de registro para PeerRecordCollection o cuando ha llegado al final de varias nubes .

La clase PeerNameResolver expone un método sobrecargado que se llama Resolve y se utiliza para resolver un par determinado sincrónicamente.

El Listado 17 muestra cómo tratar de resolver para un igual que se llama MySecurePeer. El método Resolve devuelve una colección del tipo PeerNameRecordCollection a través de la cual iteramos. El Listado 18 muestra el resultado de esto cuando se ejecuta en una computadora que tiene tres tarjetas de red.

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()); 
    } 
} 

lo tanto, supongo que debe salir PeerNameResolver.Resolve Method:

Este método se asoman nombres asociados a nubes. Llamar al método PeerNameResolver es similar a llamar al método Resolve para cada registro del nombre del mismo PeerNameRecordCollection.Tenga en cuenta que utilizando el método Resolve en un registro de nombre de igual individual no invalidar la resolución de múltiples nombres de igual .

Por cada método Resolve, existe un método equivalente ResolveAsync. Son idénticos en los parámetros que se pasan , excepto que el método ResolveAsync incluye un token del sistema en su lista de parámetros para el manejo de eventos asíncronos .

Cuestiones relacionadas