P2P同步框架应用指南

在这篇文章中,将展示如何在自己的项目中使用P2P同步框架。如果不想使用NuGet,应该跳到下一节:“手动添加程序集引用”。

使用NuGet安装

假设已经熟悉NuGet,如果不是,可以在这里了解更多。

搜索并安装P2PSync包(在搜索框中输入P2P):

安装包后,应该在项目中看到基础设施程序集。依赖项(NLog)以及app.config文件包含新的部分。

  • NLog.dll
  • NLog.Extended.dll
  • (NLog的自定义包装器) Roniz.Diagnostics.Logging.dll

这些程序集用于支持日志记录,使用Log2Console。可以从Codeplex下载。

  • Roniz.WCF.P2P.Channels.dll
  • Roniz.WCF.P2P.Messages.dll
  • Roniz.WCF.P2P.Sync.dll

手动添加程序集引用

如果不想使用NuGet,应该从Codeplex项目站点下载最新版本。

解压文件后,将以下程序集添加到项目中:

  • Roniz.Diagnostics.Logging.dll
  • Roniz.WCF.P2P.Channels.dll
  • Roniz.WCF.P2P.Messages.dll
  • Roniz.WCF.P2P.Sync.dll

从NLog下载并添加以下程序集:

  • NLog.dll
  • NLog.Extended.dll

实现自己的业务逻辑类

实现自己的业务逻辑同步类 - 继承自Roniz.WCF.P2P.Sync.Interfaces.ISynchronizationBusinessLogic(在示例应用程序中,这是Roniz.WCF.P2P.ApplicationTester.MySynchronizationBusinessLogic类)。应该覆盖以下方法:

  • ProvideFullPresenceInfo - 可以返回任何从FullPresenceInfo派生的类,或者null,如果决定在其他节点上线时不发送任何信息。
  • OnOnlineAnnouncementReceived - 当其他节点接收到上线节点的公告时调用此方法,该方法接收先前FullPresenceInfo的派生实现。
  • ProvideCompactPresenceInfo - 可以返回任何从CompactPresenceInfo派生的类,或者null,如果决定在节点关闭前不发送任何信息(在Close()方法中调用)。
  • OnOfflineAnnouncementReceived - 当其他节点接收到下线节点的公告时调用此方法,该方法接收先前CompactPresenceInfo的派生实现。
  • OnPresenceInfoChangedReceived - 当其他节点接收到更改其存在信息的节点的公告时调用此方法。例如,如果节点监听某个IP地址以接收来自其他节点的消息,并通过ProvideFullPresenceInfo()通知此信息,然后节点IP地址更改,它可以将此信息发送给其他节点,他们将通过此方法接收它。
  • ProvideSynchronizationResponse - 调用以提供对其他节点先前请求的响应,以获取节点自己的同步详细信息。通常,节点将响应有关其自己数据的一些紧凑响应,而不是完整的详细数据,以减少节点之间的不必要数据。
  • ProvideSynchronizationDetailRequest - 在节点在接收到ProvideSynchronizationResponse的响应后启动同步时调用,允许他们请求同步的特定详细信息。
  • ProvideSynchronizationDetailResponse - 调用其他节点以允许他们响应完整的同步详细信息。
  • ProvideFullSynchronizationDetailResponse - 调用其他节点以允许他们响应未通过某些关键信息过滤的完整同步详细信息,如在ProvideSynchronizationDetailResponse方法中。
  • OnSynchronizationDetailsResponseReceived - 在节点在接收到完整或部分同步的响应后启动同步时调用。
  • OnUpdateReceived - 在节点接收到来自另一个节点的Update消息时调用。
  • [可选]还可以覆盖OnCommunicationStateChanged方法,以便在通信状态更改时采取行动。

还有一个名为IsNeedFullSynchronization的属性,由基础设施自动设置,以确定启动同步过程的节点是否需要完整或部分同步。但是,开发人员可以设置此属性。例如,如果他认为在某些条件下,他需要完全同步。

实现的消息

  • FullPresenceInfo - 包含从上线节点发送到其余网状节点的数据的类。(在示例应用程序中,这是Roniz.WCF.P2P.ApplicationTester.Messages.MyFullPresenceInfo类。)
  • CompactPresenceInfo - [可选]包含从下线节点发送到其余网状节点的数据的类。(在示例应用程序中,这是Roniz.WCF.P2P.ApplicationTester.Messages.MyCompactPresenceInfo类。)
  • BusinessLogicMessageBase - 这个类用作所有同步消息的基类。

代码(从测试应用程序中获取的代码示例)

启动同步管理器:

SyncManager = new SynchronizationStateManager(MySynchronizationBusinessLogic);

当想要开始同步时:

SyncManager.Open();

根据应用程序特定逻辑,可选地调用SyncManager上的更新:

var updateState = new MyStateContainer { StateDictionary = new Dictionary(1) }; updateState.StateDictionary.Add(id, UserState); SyncManager.Update(updateState);

关闭同步管理器:这行代码将向其他节点发送通知,当前节点正在关闭 - 他们可以在他们的业务逻辑层中对此消息做出反应。

SyncManager.Close();

如果使用NuGet安装包,app.config文件已经合并,并且包含以下部分。如果没有通过NuGet安装,应该自己手动添加这些部分。

<system.serviceModel> <bindings> <netPeerTcpBinding> <binding name="NetPeerTcpBindingUnsecure"> <security mode="None"/> </binding> </netPeerTcpBinding> </bindings> <client> <endpoint address="net.p2p://Roniz.WCF.P2P.Sync.DefaultMeshAddress" binding="netPeerTcpBinding" bindingConfiguration="NetPeerTcpBindingUnsecure" contract="Roniz.WCF.P2P.Sync.Interfaces.ISynchronizedState" name="SyncDefaultEndpointConfigurationName" kind="" endpointConfiguration="" /> </client> </system.serviceModel>
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485