【问题标题】:WCF Peer to Peer, Are There Nodes Out There?WCF 点对点,是否有节点?
【发布时间】:2009-07-08 10:33:14
【问题描述】:

我在 .NET 3.5 中使用 WCF 来实现对等网络应用程序。为了解析对等节点,我使用 PNRP。

IGlobalStoreServiceContract 是我的合约如下图,

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

我正在使用类似这样的代码将每个节点加入对等网络。

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

globalStoreChannel.Open();

我的问题是,一旦我打开了通道,如何才能最好地判断其他对等节点是否在网络上?

例如,我可以调用我的合约 RegisterNode 中的一种方法,并且网络中的每个节点都可以使用回调来调用 SynchronizeMemberList。然后我会知道是否还有其他节点。

问题在于它都是异步的。如果我调用 RegisterNode 并且没有人回复,这并不意味着真的没有人在那里,它可能只是意味着我没有等待足够长的时间。

你怎么看?有什么建议吗?

【问题讨论】:

    标签: c# .net wcf


    【解决方案1】:

    参见 Amit Bahree 和 Chris Peiris 的 Peer-to-Peer Programming with WCF and .NET Framework 3.5: Peer Name

    创建后的最后逻辑步骤 并发布对等点正在解决 同行。发表有什么好处 如果另一个对等点,云的东西 找不到你?我们使用 PeerNameResolver 类解决 给定云中的特定对等点。这 PeerNameResolver 可以解析一个对等点 PeerRecord 或云, 取决于参数是 通过了。解决过程 当最大时完成 的记录条目数 已达到PeerRecordCollection 或 当它到达各种结束时 云。

    PeerNameResolver 类公开了一个称为Resolve 的重载方法,用于同步解析给定的对等点。

    清单 17 向我们展示了如何尝试解析名为 MySecurePeer 的对等点。 Resolve 方法返回一个PeerNameRecordCollection 类型的集合,我们通过它进行迭代。清单 18 显示了在具有三个网卡的计算机上运行时的结果。

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

    所以,我想你应该看看PeerNameResolver.Resolve Method

    此方法将节点名称关联到 云。拨打PeerNameResolver 方法类似于调用 Resolve 每个对等名称的方法 记录在 PeerNameRecordCollection。注意 使用Resolve 方法 个人同行姓名记录不 无效解析多个对等点 名字。

    对于每个Resolve 方法,都有一个 等效ResolveAsync 方法。他们 它们的参数相同 被通过了,除了 ResolveAsync方法包括系统 其参数列表中的令牌 异步事件处理。

    【讨论】:

      猜你喜欢
      • 2014-08-29
      • 2017-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-14
      相关资源
      最近更新 更多