- 易迪拓培训,专注于微波、射频、天线设计工程师的培养
利用Vista和WCF中强大P2P通信功能
与标准的WindowsCommunicationFoundation代码相比,不同之处只在于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作为一个参数传递。
要将包含图片的消息发送到网格中的其他节点,我必须编写几行代码,但是此代码与您在其他任何WindowsCommunicationFoundation应用程序中编写的代码几乎相同。起初,我需要在类型ChannelFactory和IPictureViewer的窗体中定义一些字段。接下来,我需要在窗体的构造函数中将这些变量实例化。这些步骤如下所示。
创建发送基础结构
ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
publicpartialclassfrmPictureViewer:Form,IPictureViewer
{
ChannelFactorychannelFactory;
IPictureViewerchannel;
publicfrmPictureViewer()
{
InitializeComponent();
StartReceiving();
}
privatevoidStartReceiving()
{
//为清晰起见省略其他代码
channelFactory=newChannelFactory(
binding,newEndpoin
tAddress(meshAddress));
channelFactory.Credentials.Peer.MeshPassword="JustinSmith";
channelFactory.Credentials.Peer.Certificate=GetCertificate();
channel=channelFactory.CreateChannel();
}
...//为清晰起见省略其他代码
}
请注意,所使用的网格密码和证书(用于创建消息的数字签名)与设置ServiceHost时所用的必须是同一个。除此之外,此代码要与非PeerChannelWindowsCommunicationFoundation应用程序中所需的代码相同。
既然我已经构建了自己的发送基础结构,我就可以使用它向网格中的其他节点发送消息。为此,我只需为共享按钮编写一个事件处理程序即可,如下所示:
privatevoidbtnShare_Click(objectsender,EventArgse)
{
using(MemoryStreamstream=newMemoryStream())
{
Imageimage=pbView.Image;
image.Save(stream,ImageFormat.Jpeg);//将图像存储到stream中
stream.Position=0;//复位位置
channel.SharePicture(stream);//向网格发送消息
}
}
简言之,PeerChannel大大简化了P2P应用程序的开发。PictureViewer的完全功能版约有150行源代码,其中大部分代码专用于Windows窗体基础结构。这个功能完全的应用程序包含了一个跳跃计数实现。
PeopleNearMe
PNM是集成在WindowsVista之中的一种网格技术,它允许邻近的设备组和人员组相互发现、连接、邀请并进行协作。PNM特别适用于这样一些任务:在咖啡店与邻座其他几个人一起玩游戏;与同事共享您的桌面;甚至连接到会议室中的投影仪,等等。PNM提供的这些功能如此强大,我们有理由假设,一旦它被发布,开发人员社区就将会找到新的、具有独创性的方式来利用此技术。重要的是,要注意PNM是一项完全自选的网格技术,在默认情况下是关闭状态。
除其他应用程序之外,PNM体系结构包含了一个称为p2phost.exe的P2P应用程序。此进程运行时,将通过连接到其他计算机上p2phost.exe的实例来创建网格。通常而言,此网格的用途是定向消息传送。更确切地说,PNM用于解析本地节点并与这些本地节点的子集进行通信。PNMAPI作为WindowsAPI的一部分提供,并且多半程度上侧重于配置p2phost.exe的行为。
总的来说,PNMAPI的主要类别包括函数、结构、事件和错误代码,通过这些类别可以向PNM注册应用程序、邀请其他人加入协作会话、启动已注册的应用程序、创建持久性合约并邀请不再属于本地的联系人。提要栏中的"真实环境中PeopleNearMe的示例"将例示此过程。请注意,不支持应用程序使用PNM进行通信。就PictureViewer而言,这表示在提要栏中说明的Tom和Harry的PictureViewer实例之间传递的消息仍由PeerChannel来处理。
结束语
P2P应用程序开发是一个涉及范围非常广泛的主题,并且对于多数开发人员而言还相当陌生。随着WindowsVista和.NETFramework3.0的发布,P2P应用程序的传统开发门槛将明显降低。我相信,技术的进步(如PNRP、IPv6)加上更具生产力的新型平台的问世(如PeerChannel和PNM)将在P2P应用程序开发领域开创一个新时代。最终,应用程序将更具协作性,并提供我们起初只能想像的一些功能。
来源:微软
上一篇:Goonie互联网舆情研究与监管模式解析
下一篇:测试VoIP呼叫质量