从物理上说,跳跃计数在消息中被表示为标头块中的一个整数。当某节点收到带有跳跃计数的消息时,它会检查跳跃计数的值。如果该值大于零,节点会单调递减此跳跃计数,然后将带有递减后的跳跃计数值的消息转发给相应邻居。如果所接收消息中包含的跳跃计数为 0,则不转发该消息。另需注意的重要一点是,跳跃计数标头块被排除在消息签名之外,因此更改这个值不会影响到应用于消息的数字签名的完整性,而且会防止产生与重复生成数字签名并将其序列化到消息相应部分中所关联的开销。
PeerChannel 示例 让我们用 PeerChannel 和 Windows 窗体来构建一个简单的 P2P 应用程序,称之为 PictureViewer。顾名思义,该应用程序的用途是允许网格中的所有节点可以查看同一张图片。从高层次来说,构建此应用程序所需的步骤如下所示:
1.定义基本的 Windows 窗体样板代码。
2.向窗体添加控件。
3.定义必需的 Windows Communication Foundation 服务合约。
4.编写连接到网格和从网格接收消息所需的 Windows Communication Foundation 代码。
5.编写向网格中其他节点发送消息所需的代码。
图 3 显示了完成后的应用程序。步骤 1 和 2 是开发任何 Windows 窗体应用程序时所必需的步骤,因此我将不在这里对其说明。对于任何 Windows Communication Foundation 应用程序,开发过程的第一步是定义服务合约。PeerChannel 要使用的服务合约类似于其他 Windows Communication Foundation 合约,只不过 PeerChannel 需要所有的 OperationContractAttribute 批注都将 IsOneWay 实例属性设置为 true。此属性规定消息的接收方不应发送回复。如果想要接收方发送回复,可以将服务合约定义为双向合约,但每个 OperationContractAttribute 批注仍必须将 IsOneWay 实例属性设置为 true。就此例而言,我不会创建一个双向合约(Windows SDK 中有几个双向合约的示例)。我要使用的合约如下所示:
| [ServiceContract] interface IPictureViewer { [OperationContract(IsOneWay = true)] void SharePicture(Stream stream); } |

图 3 PictureViewer P2P 应用程序
请注意,SharePicture 接口方法用 OperationContractAttribute 属性加以批注,并且 IsOneWay 实例属性被设置为 true。SharePicture 操作将 System.IO.Stream 视为一个参数,因为此操作将被用于向网格中其他节点传送图片的字节。
在定义了我们的服务合约后,现在就该添加 Windows Communication Foundation 代码,该代码会将我们的应用程序连接到 PeerChannel 网格并且被动等待来自网格的消息。首先,在窗体中实现新定义的服务合约。然后,定义类型 ServiceHost 的字段。所接收的消息将被发送到 frmPictureViewer 类型的单个实例。要表明此功能,我必须将正确的 ServiceBehavior 分配给 frmPictureViewer 类型。这两个步骤如图 4所示。
接下来,我必须对 ServiceHost 进行实例化,添加端点并开始侦听外来的消息。由于我正在构建 Windows 窗体应用程序,因此实现此操作的逻辑位置就是窗体的构造函数,如图 5 所示。
此时,我已经完成了要连接到网格并侦听消息所需的所有步骤。与标准的 Windows Communication Foundation 代码相比,不同之处只在于 Uri 的方案 (net.p2p)、所使用的绑定 (NetPeerTcpBinding) 以及所增添的基于密码的安全性。请注意,我已选择将网格密码直接置于代码中,这一点很重要。如果想要使网格密码保密,请不要在您当前所使用的应用程序中如此操作。
只要调用了 ServiceHost.Open,我们的应用程序就会尝试通过 PNRP 来解析网格名 (pictureView)。此时,我可以通过运行 netsh 命令以列出注册的对等名称来验证我们的 PeerChannel 应用程序是否正在使用 PNRP。如果 PNRP 可以将网格名解析为一个或多个 IP 地址,则我们的应用程序将尝试连接到这些节点。如果不是这样,则该节点将成为网格中的第一个节点。如前所述,现有节点将通过发送欢迎消息或拒绝消息来接受或拒绝连接。这里的重要一点是,这种情况有可能在对 ServiceHost.Open 的调用返回后发生。
将消息发送到其他节点 在共享图片之前,我必须首先加载图片。实现此操作所需的代码是 Windows 窗体基本代码:首先,对 OpenFileDialog 进行实例化,获得一个 Stream,将该 Stream 转换为 Image,然后通过 PictureBox.Image 属性引用 Image。等一下,这不是 SharePicture 方法所执行的操作吗?事实上,确实如此。从本质上说,要将图像加载到 PictureBox 中,我只需要调用 SharePicture 方法,将从 OpenFileDialog.OpenFile 返回的 Stream 作为一个参数传递。
要将包含图片的消息发送到网格中的其他节点,我必须编写几行代码,但是此代码与您在其他任何 Windows Communication Foundation 应用程序中编写的代码几乎相同。起初,我需要在类型 ChannelFactory
请注意,所使用的网格密码和证书(用于创建消息的数字签名)与设置 ServiceHost 时所用的必须是同一个。除此之外,此代码要与非 PeerChannel Windows Communication Foundation 应用程序中所需的代码相同。
既然我已经构建了自己的发送基础结构,我就可以使用它向网格中的其他节点发送消息。为此,我只需为共享按钮编写一个事件处理程序即可,如下所示:
| private void btnShare_Click(object sender, EventArgs e) { using(MemoryStream stream = new MemoryStream()) { Image image = pbView.Image; image.Save(stream, ImageFormat.Jpeg); // 将图像存储到 stream 中 stream.Position = 0; // 复位位置 channel.SharePicture(stream); // 向网格发送消息 } } |
简言之,PeerChannel 大大简化了 P2P 应用程序的开发。PictureViewer 的完全功能版约有 150 行源代码,其中大部分代码专用于 Windows 窗体基础结构。这个功能完全的应用程序包含了一个跳跃计数实现,可以从 MSDN?杂志网站下载。
People Near Me
PNM 是集成在 Windows Vista 之中的一种网格技术,它允许邻近的设备组和人员组相互发现、连接、邀请并进行协作。PNM 特别适用于这样一些任务:在咖啡店与邻座其他几个人一起玩游戏;与同事共享您的桌面;甚至连接到会议室中的投影仪,等等。PNM 提供的这些功能如此强大,我们有理由假设,一旦它被发布,开发人员社区就将会找到新的、具有独创性的方式来利用此技术。重要的是,要注意 PNM 是一项完全自选的网格技术,在默认情况下是关闭状态。
除其他应用程序之外,PNM 体系结构包含了一个称为 p2phost.exe 的 P2P 应用程序。此进程运行时,将通过连接到其他计算机上 p2phost.exe 的实例来创建网格。通常而言,此网格的用途是定向消息传送。更确切地说,PNM 用于解析本地节点并与这些本地节点的子集进行通信。PNM API 作为 Windows API 的一部分提供,并且多半程度上侧重于配置 p2phost.exe 的行为。
总的来说,PNM API 的主要类别包括函数、结构、事件和错误代码,通过这些类别可以向 PNM 注册应用程序、邀请其他人加入协作会话、启动已注册的应用程序、创建持久性合约并邀请不再属于本地的联系人。提要栏中的“真实环境中 People Near Me 的示例”将例示此过程。请注意,不支持应用程序使用 PNM 进行通信。就 PictureViewer 而言,这表示在提要栏中说明的 Tom 和 Harry 的 PictureViewer 实例之间传递的消息仍由 PeerChannel 来处理。
结束语
P2P 应用程序开发是一个涉及范围非常广泛的主题,并且对于多数开发人员而言还相当陌生。随着 Windows Vista 和 .NET Framework 3.0 的发布,P2P 应用程序的传统开发门槛将明显降低。我相信,技术的进步(如 PNRP、IPv6)加上更具生产力的新型平台的问世(如 PeerChannel 和 PNM)将在 P2P 应用程序开发领域开创一个新时代。最终,应用程序将更具协作性,并提供我们起初只能想像的一些功能。专题:http://www.qqread.com/soft-engineering/d276680.html
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
相关专题
- P2P工具软件专题 (875篇文章)
- 常用软件加密宝典 (7726篇文章)
- 杀毒软件专栏 (7032篇文章)
- Windows Vista 专区 (4602篇文章)
- P2P软件的使用和管理 (875篇文章)
- Windows Vista系统新特性 (4602篇文章)
- 软件插件 (7362篇文章)
- 热门通信技术专区 (2013篇文章)
- 通信技术专题 (2013篇文章)
- Wlan组网----家庭专题 (4108篇文章)
- 在Windows上安装配置Apache2.2.3及实现多站 (1204次浏览)
- 详细讲解 什么是设计模式? (602次浏览)
- Vista新技术:WCF开发指南之构建服务 (522次浏览)
- 简单对象协议(SOAP)简介 (519次浏览)
- 使用ADS1.2进行嵌入式软件开发 (507次浏览)
- 小型软件的通用界面设计制作指南 (310次浏览)
- 利用UML类图设计Java应用程序详解 (156次浏览)
- SOA方法学与面向服务的分析和设计 (150次浏览)
- 软件开发商如何实现高效管理(1) (137次浏览)
- Linux中的Ramdisk与Initrd (135次浏览)



