【原】P2P应用的探究

     什么是P2P(peer to peer)?

     跟P2P对应的是传统的客户端-服务器(C/S或B/S)体系结构,这种体系结构就是客户端发送请求,服务器端给予响应。但是随着客户端不断的增加,成了服务器端崩溃的主要原因。增加服务器的功能或者资源,增加更多的服务器可以缓解这种情况,但除此之外,对等网络(P2P)可以从本质上避免服务器的崩溃问题。
     首先,先了解一下文件共享技术(如BitTorrent)的工作方式:
     许多人同时从一个服务器上下载一个资源,往往会使服务器的负载很重。而P2P技术不把资源直接从服务器上发送给客户端,而是先把文件仅分发给几个客户端,另外的客户端可以从已经存在该资源的客户端上下载,更多的客户端可以从这些二级客户端上下载,以此类推。实际上,这个过程把文件分解为几个块,再把这些块分解到客户端上,一些客户端从服务器上下载文件,另外的客户端从其他客户端上下载,所以这个过程会更快完成。
      但是P2P体系存在一些问题:客户端如何检测其他客户端的存在?如何定位其他客户端包含的文件块?如何进行客户间的通信?
     所以每个P2P网络应用程序的客户端能够完成以下操作:
     1.它必须能够发现其他客户端
     2.它必须能够连接其他客户端
     3.它必须能够与其他客户端通信
     对于发现问题,有两个明显的解决方案:
     a.在服务器上保存客户端的列表,这样客户端可以获得该列表,并联系其他客户端;
     b.使用一个基础结构(比如本文要说的PNRP)。
     对于连接问题,需要考虑P2P应用程序使用的网络的整体结构。
     对于通信问题,利用通信协议(Tcp/ip,Http)来解决。
     
     发现、连接和通信是所有P2P实现方案的核心。
     .NET下如何实现?
     发现:使用System.Net.PeerToPeer类型和PNM进行发现;
     连接:使用PNRP进行连接;
     通信:使用WCF进行通信。
     
     P2P解决方案适用于以下类型应用程序:
     1.内容发布应用程序,如文件共享应用程序;
     2.合作应用程序,如桌面共享和共享白板;
     3.多用户通信,允许用户之间直接通信和交换数据,而不是通过服务器通信;
     4.分布式处理应用程序,处理海里数据;
     5.Web 2.0应用程序,在下一代动态web应用程序中合并上述一部分或全部功能。
 
     接下来介绍一下PNRP服务和PNM服务,它们是windows下实现P2P的基础服务。   
     PNRP(Peer Name Resolution Protocol,对等机名称解析服务),用于发布和解析对等机;
     
     PNM(Peer Near Me)服务器,用于定位本地的对等机。
     PNRP云(实际上是由一个种子服务器维护,该服务器维护至少一个对等机记录),PNRP可以在云中注册对等机记录,供云中其他对等机使用。
 
     如何构建P2P应用程序呢?
     使用System.Net.PeerToPeer和System.Net.PeerToPeer.Collaboration命名空间里的类。
 
     一、P2P资源发布过程

资源发布就是资源所有者向P2P网络云中注册资源的过程,它分为以下3个步骤。

(1)  创建一个P2P关键词对象
(2)  创建一个关联到指定云的注册对象,
(3)    进行注册

下面的代码演示了如何向所有可用云中注册“0.test”这个名称,并将这个名称关联到本机的6000端口(通常同时监听这个端口,以响应资源访问者的请求)的过程

PeerName  pn = new PeerName("test", PeerNameType.Unsecured);
PeerNameRegistration  pnr = new PeerNameRegistration(pn, 6000,   Cloud.Available);
pnr.Start();

二、撤销已发布到云中的资源

只需要调用注册对象的stop方法,代码如下。
pnr.Stop();

三、资源的发现:
就是在云中搜索指定的关键词,分以下三个步骤。
(1)  .创建一个待搜索的名称对象。
(2) .创建一个名称解释器对象。
(3) .从指定云中检索此名称对象。
下面代码演示了如何从所有可用云中检索名称“0.test”的过程,此过程最多返回10条符合要求的记录。
PeerName  searchname =new PeerName("0.test");
PeerNameResolver  resolver = new PeerNameResolver();
PeerNameRecordCollection  results= resolver.Resolve(searchname, Cloud.Available,10);

四、获取此名称对应的资源:
按P2P名称检索到相应的资源名称后,假设保存在results集合对象中,通过以下方法就可以获取此名称对应的资源了。
foreach (PeerNameRecord record in results)
{
      //获取资源所在的位置
       foreach(IPEndPoint endpoint in record.EndPointCollection)
       {
       //对方通常在监听这个IPEndPoint,与之发起连接即可与之通信或其它交互了
       }
       //获取资源对应的数据
       byte[] remoteresource=record.Data;
}
 

 

posted on 2013-03-29 23:16  carfieldfei  阅读(295)  评论(0编辑  收藏  举报

导航