《电子技术应用》
您所在的位置:首页 > 通信与网络 > 设计应用 > 基于WCF和对等网络的即时通信软件的设计与开发
基于WCF和对等网络的即时通信软件的设计与开发
来源:微型机与应用2013年第22期
董袁泉
(沙洲职业工学院, 江苏 张家港215600)
摘要: 介绍了Microsoft用于构建分布式面向服务架构的新一代框架WCF(Windows Communication Foundation)的体系结构与技术要素;同时分析了对等网络(Peer-to-Peer network)的基本原理和网格化特性。在分析WCF和P2P网络优点的基础上开发了一个即时通信软件,总结了使用.NET平台开发P2P应用的基本步骤,阐述了对等网络是开发P2P应用的理想平台。
Abstract:
Key words :

摘  要: 介绍了Microsoft用于构建分布式面向服务架构的新一代框架WCF(Windows Communication Foundation)的体系结构与技术要素;同时分析了对等网络(Peer-to-Peer network)的基本原理和网格化特性。在分析WCF和P2P网络优点的基础上开发了一个即时通信软件,总结了使用.NET平台开发P2P应用的基本步骤,阐述了对等网络是开发P2P应用的理想平台。
关键词: WCF; SOA; 对等网络; 网格化; 即时通信

    对等网络P2P(Peer to Peer)也称为对等连接,是一种新的通信模式。P2P网络的一个重要目标就是让所有的客户端都能提供资源,包括带宽、存储空间和计算能力。因此,当有节点加入且对系统请求增多,整个系统的容量也增大。这是目前客户机/服务器(C/S)结构不能实现的。
    P2P的应用开发是分布式网络开发的一种典型应用,软件开发难度较大,WCF(Windows Communication Foundation)作为微软基于SOA所推出的.NET平台下的新一代框架产品集成了现有技术的优点。本文将综合利用对等网络和WCF实现一个即时通信软件,采用WCF快速、便捷地开发P2P应用。
1 WCF概述
    WCF整合了Com+、.Net Remoting、WebService等现有技术的优点,提供了一种构建安全可靠的分布式面向服务系统的统一的框架模型,使软件开发人员在开发分布式应用时变得更加轻松[1]。
1.1 面向服务
    WCF是一套面向服务的框架。服务是指暴露在外的一系列功能的集合,面向服务则是指一套构建“面向服务程序”的抽象原则以及最优方法[2]。基于WCF的程序设计考虑更多的是提供和使用服务。
    WCF拥有一个非常灵活的分层体系结构,它的目标是在单个框架中提供编码、托管、消息传递模式、网络连接、安全性和互操作性,这有助于简化分布式应用程序的开发[3]。
1.2 WCF的编程模型
    WCF服务是通过端点通信的。WCF服务的端点充当与其他应用程序通信的网关。它是发送或接收消息的位置,包含交换消息所需的所有信息。端点由地址、绑定以及契约三部分组成[4],如图1所示。

    地址制定该服务所驻留的位置,它表示为URL形式。绑定描述了WCF服务如何与客户端应用程序通信。契约是对WCF服务所提供功能的声明。契约公开服务的接口、类、方法和变量,以使客户端应用程序能够访问和使用它们。
2 P2P对等网络
    在P2P对等网络中,将由对等节点组成的集合称为网格(mesh)。任何一个对等节点都可以通过指定终节点(Endpoint)的方法来加入到一个网格中。网格是彼此之间可以相互通信并由唯一的网格ID标识的对等节点的命名集合。网格中的活动节点发布其网格名称,以便其他节点可以找到它们。
    解析程序服务可以获取网格ID,然后返回与向该特定网格ID注册的节点对应的地址列表。解析程序保持已注册地址的列表,此列表是它通过让网格中的每个节点向该服务注册而创建的。
    对等解析程序(PNRP)负责将网格ID解析为网格中节点的终节点地址[5]。在打开一个对等节点后,它会使用对等解析程序将网格ID解析为网格中其他对等节点的地址列表。这会创建一个由互连节点组成的网格,从而允许通过网格传播消息。
3系统的设计与实现
3.1系统总体设计

    P2P应用程序的设计与普通分布式应用程序不同,在设计时必须考虑到应用程序本身既是服务的提供方同时也是服务的调用方。软件整体结构如图2所示[6]。

    每个加入到P2P对等网络节点的客户端可以通过EndPoint来加载WCF的服务契约并发布出去,但是整个对等网络中没有中央服务器的存在,所以节点与节点之间相互发现和通信比较困难,P2P对等网络通过称为PNRP的名称解析的服务来解决这样的问题。
3.2 服务端程序的设计
    服务端主要的功能是创建一个CustomPeerResolverService类型的ServiceHost代理,启用对等解析程序(PNRP),还负责提供服务主机的基址,该基址在配置文件(App.config)中进行配置。经过配置之后,服务便可以由客户端的计算机在该基址访问。具体代码如下:
      using System.ServiceModel.PeerResolvers;
//添加对等名称解析协议服务
       ……
     CustomPeerResolverService cprs;       
                 //声明自定义对等解析程序服务的变量
       ServiceHost host;   //声明服务代理类
       ……
     cprs=new CustomPeerResolverService();  //初始化变量
     host=new ServiceHost(cprs);
     在配置文件(App.config)定义一个终节点,使客户端可以与服务进行通信。使用NetTcpBinding进行绑定。
      App.config配置如下:
     <endpoint address="net.tcp://localhost/P2PChatServer" binding="netTcpBinding"… ></endpoint>
      经过配置之后,服务便可以由客户端在 net.tcp://localhost/P2PChatServer处访问。
3.3 客户端加入网格
     要实现P2P对等网络中的节点相互通信,首先需要创建和注册同级,其他同级需要查找和访问已注册的同级。
      需要特别注意的是网格中的每台计算机既可以作为客户端又可以作为服务器,那么设计所要实现的契约时,应将契约的回调契约指定为其自身。这样无论是调用方还是被调用方都能够实现相同的操作,使得每台计算机既能充当客户端又能成为服务端[6]。创建契约的代码如下:
 [ServiceContract(CallbackContract=typeof(IChatService))]
                             //将回调契约定义为本身
 public interface IChatService
  {
    [OperationContract(IsOneWay=true)]
     void DoSomeWork;                           //实现相应的功能
     }
    使用WCF中的DuplexChannelFactory<T>泛型类创建一个双向通道来实现双向调用。使用该通道的CreateChannel()方法来创建通信通道的一个实例。整个对等名称解析过程是由netPeerTcpBinding绑定封装的,在创建通道的同时,会在网格中注册节点,使得节点加入网格[6]。代码如下:
     InstanceContext context=new InstanceContext(this);
                                            //上下文实例
    Factory=new DuplexChannelFactory<IChatChannel>(context,"ChatEndPoint");  

                        //创建双工通信
  Channel =Factory.CreateChannel();                //创建通道
3.4 网格中的计算机获取节点标识
    当网格内有新的节点加入或退出时必须发送一个消息,这样新的节点能查找到网格内其他的节点。只有网格内所有的节点有一个唯一的标识,才能实现对特定节点服务的调用,实现网格中客户端点对点的相互通信。因此在编写客户端服务契约时必须包含获取网格节点的方法以及提供节点加入或退出网格的事件处理代码。
    通过DuplexChannelFactory<T>创建的双向通信能够调用客户端服务契约的方法,当有新的节点加入网格时通过调用通道实例中的Join()方法将节点的标识传递给网格内其他节点。
    由于在服务端App.config文件中定义了统一的基地址,所以对通道方法的调用是对网格内所有节点的调用,因此网格内其他节点就可以发现新加入的节点。具体实现的方法如下:
    delegate void UserJoined(stringname);//声明加入网格代理
    static event UserJoined NewJoin;     //定义加入网格事件
    public void Join(stringmemberName)
     {
     if(NewJoin!=null)
     {
   NewJoin(memberName);
    }
     }
    …
   Channel.Join(this.userName)
   当有节点退出网格时,与加入网格时一样声明一个退出网格事件代理,然后调用通道实例中的Leave()方法,退出网格;具体实现代码与加入网格相似。
    网格中节点之间消息的传递也可以声明一个消息发送事件代理,在发送时可以加入自身的标识作为参数,以便其他人能够识别。
4 系统的测试与运行
    系统的开发工具选择Visual Studio 2010,程序编译通过后,首先打开即时通信服务端软件,然后单击开始,服务启动成功,如图3所示。

 

 

     在两台客户端计算机上分别运行即时通信客户端软件并且输入用户名,点击Join按钮后节点会在网格中注册并获取网格中其他节点的标识,此时两台计算机作为两个节点成功加入到网格中。在图4中,一台计算机成功地接收到了另一台计算机自身登录名称和它所发送的消息。

    本文介绍了如何使用WCF来开发P2P应用程序。P2P应用程序开发成本低并且拥有较好的并发处理能力,适用于小规模的网络,维护容易;但是对等网络同时也存在一些不足和缺点,如资源分享紊乱、管理较难、安全性较低等问题。虽然还存在着一些问题和不足,但P2P对等网络依然是开发点对点应用的一个理想平台。
参考文献
[1] 闫冰.基于WCF的分布式应用开发[J].电脑知识与技术,2008,3(1):68-70.
[2] 孙耀.基于WCF的网格化信息管理系统的研究与实现[D]. 长春:东北师范大学,2009.
[3] 程汤培. 基于WCF的即时通信软件的设计与实现[J].  电脑编程技巧与维护,2008(4):24-40.
[4] 陈茹. WCF框架下分布式系统的集成技术研究[D].大连:大连海事大学,2010.
[5] 罗小平.基于PNRP协议的PeerChannel共享存储模型的研究与应用[D].成都:西南石油大学,2011.
[6] 王丽丽,戴迪,王成江.Windows对等网络上P2P应用程序的设计与实现[J].计算机与信息技术,2009(3):36-40.

此内容为AET网站原创,未经授权禁止转载。