wcf p2p能够P2P通讯 或者打洞吗

WCF中P2P的强大功能_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
WCF中P2P的强大功能
上传于||文档简介
&&WCF中P2P的强大功能
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩8页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢基于WCF的即时通讯软件的设计与实现
摘要: 介绍了Microsoft用于构建分布式面向服务架构系统的新一代框架WCF的体系结构与技术要素,并通过开发一套即时通信软件展现了基于WCF构架开发分布式应用程序的编程步骤与技巧。
关键词:WCF;SOA;分布式;即时通信
自从在微软提出.NET战略以来,就针对建立企业级的分布式应用先后推出了一系列产品和技术,包括:ASP.NET Web服务、.NET Remoting、Message Queuing以及Enterprise Service等。这些技术为基于微软技术的软件研发人员开发分布式应用提供了很大的便利,同时也各自存在着一些不足。WCF(Windows Communication Foundation)作为微软基于SOA所推出的.NET平台下的新一代框架产品集成了现有技术的优点,代表了未来软件架构设计与开发的发展方向。因此,掌握并能在未来应用中合理运用WCF技术,对于程序员特别是基于微软技术开发的程序员而言是十分必要的。基于此,文章通过介绍一套即时通信软件的具体开发过程来展现基于WCF技术的分布式软件研发的基本步骤与高级技巧。
二、WCF概述
对于一个好的分布式系统来讲,设计时应当考虑到异构性、开放性、安全性、可扩展性、故障处理、并发性以及透明性等问题。基于SOAP的Web Service可以实现异构环境的互操作性,保证了跨平台的通信。利用WSE(Web Service Enhancements)可以为ASMX提供安全性的保证。.NET Remoting具有丰富的扩展功能,可以创建定制的信道、格式化器和代理程序。Enterprise Service(COM+)提供了对事务的支持,其中还包括分布式事务,可实现故障的恢复。MSMQ可以支持异步调用、脱机连接、断点连接等功能,利用消息队列支持应用程序之间的消息传递。从功能角度来看,WCF整合了ASMX、.Net Remoting、Enterprise Service、WSE以及MSMQ等现有技术的优点,它提供了一种构建安全可靠的分布式面向服务系统的统一的框架模型,使软件研发人员在开发分布式应用时变得更加轻松。
1. 面向服务
既然WCF是一套面向服务的框架,服务自然便是WCF中最为重要的概念。服务是指暴露在外的一系列功能的集合,面向服务则是指一套构建“面向服务程序”的抽象原则以及最优方法。对于业务逻辑的理解,传统的编程方式认为应将业务逻辑封装为对象,该对象提供了与业务相关的一些功能;而基于WCF的程序设计却更多的是考虑如何提供服务以及消费服务。与面向组件服务程序类似,基于SOA 的应用程序将服务封装到了单个逻辑程序当中,如图1所示。
图1封装服务的SOA应用程序逻辑图
2. WCF体系结构
WCF拥有一个非常灵活的分层体系结构,分布式应用程序可以使用高级API或者低级API编写。高级API或者服务层可以用于调用方法和事件。服务层把这些高级的抽象代码转换为消息,以使用低级API上的信道和端口。图2中显示了WCF应用程序的各个层。
图2 WCF体系结构图
WCF提供了对可靠性、事务性、并发管理、安全性以及实例激活等技术的有力支持,而这些支持均依赖于如图3所示的WCF构架。
在客户端,分布式应用通过一个代理来转发对宿主端所提供服务的调用,而代理拥有和服务相同的操作接口,另外还有一些附加的代理管理方法。这也就意味着客户端从来不会直接调用服务,即便这个服务就在本机的内存中。当客户端代理接收到来自客户端的调用请求后,它将消息通过信道链向下传递。每个信道都会执行相应的消息的调用前处理,例如对消息的编码、提供可靠的会话、对消息进行加密等。客户端的最后一个信道则是传输信道,根据配置的传输方式发送消息给宿主。
在宿主端,消息同样通过信道链进行传输。与客户端信道相对应,宿主端信道也会对消息执行相应的宿主端的调用前处理,例如对消息的解码、提供会话管理、对消息进行解密等。宿主端的最后一个信道则负责将消息发送给消息分发器(Dispatcher),由分发器负责调用服务的实例。
图3 WCF构架示意图
3. WCF的基本技术要素
作为基于SOA的一个框架产品,WCF实际上是构建了一个在互联系统中实现各个应用程序之间通信的分布式框架。它使得系统构架师与开发人员在构建分布式系统时,能将更多的精力投入到与系统的业务逻辑本身的设计上来,而无需过多的考虑底层通信的实现及相关问题。WCF最核心的部分是能够快捷的创建一个服务,一个WCF服务端框架由宿主、端点以及服务类三部分所组成,如图4所示。
图4 WCF服务框架
宿主(Host),即承载WCF Service运行的环境。可用的宿主环境包括:
(1) 自承载方式:在控制台应用程序与基于WinForm的应用程序中都可以使用这种方式;
(2) 系统服务方式:服务可以随着操作系统的启动而自动启动;
(3) IIS方式:与Web Services 的部署方式类似,由请求消息来激活服务,但只支持HTTP方式的绑定;
(4) WAS(Windows Process Activation Service)方式:这个宿主是 IIS7 的一部分,只有 Windows Vista 和 Windows Server 2008提供默认支持,它支持几乎所有的通讯协议并提供了应用程序池、循环回收、空闲管理、身份管理、隔离等强大的功能。
服务类(Service Class)是指一个标记了一些WCF特有的属性的类,它包含了对服务的业务逻辑的具体实现。
端点(Endpoints)是WCF实现通信的核心要素,客户端和服务端都通过端点来交换消息,WCF 允许我们为服务添加多个绑定和端点。端点由地址(Address)、绑定(Binding)以及契约(Contract)三部分组成,如图5所示。在WCF中,类ServiceEndpoint代表了一个Endpoint,在类中包含的EndpointAddress,Binding,ContractDescription类型分别对应端点中的地址、绑定以及契约。
图5 端点构成图
地址:每个服务都会关联到一个唯一的地址,因此地址定位和唯一标志了一个端点,其主要提供了两个重要信息: 服务位置以及传送协议。在WCF 中,地址由System.ServiceModel.EndpointAddress对象来表示,其包括URI、Identity、Headers三个要素。 绑定:绑定提供了一种可设置的方式来选择传输协议、消息编码、通讯模式、可靠性、安全性、事务传播以及交互方式等。例如在传输协议上可以选择HTTP/HTTPS、TCP、P2P、IPC甚至是MSMQ等方式。消息编码上可以选择使用纯文本方式来确保互操作能力,或者选择二进制编码来优化性能,或者使用 MTOM来提高负载能力,甚至是自定义编码方式。 WCF中提供了BasicHttpBinding、NetTcpBinding、NetPeerTcpBinding、NetNamedPipeBinding、WSHttpBinding、WSFederationHttpBinding、WSDualHttpBinding 、NetMsmqBinding以及MsmqIntegrationBinding九种标准类型的绑定。
契约:契约是用来描述服务功能的一种平台中立的标准方式,WCF 所有服务都需要实现一个或多个契约。WCF 定义了四种类型的契约:
(1) 服务契约(Service Contracts): 定义了客户端可以使用哪些服务操作。
(2) 数据契约(Data Contracts): 定义了服务传输的数据类型。WCF 定义了一些隐式数据契约,比如 int、string 等,但更多时候需要使用 DataContractAttribute 显式定义那些自定义类型数据的数据契约。
(3) 错误处理契约(Fault Contracts): 定义了服务引发的错误信息,以及如何将这些异常传递给客户端。
(4) 消息契约(Message Contracts ): 允许直接操控服务的消息内容和格式。
一般情况下,应当用接口来定义服务契约,尽管我们也可以使用类。将服务契约定义为接口基于如下几点优点:
(1) 便于契约的继承,不同根的类型可以自由实现相同的契约;
(2) 同一服务类型可以同时实现多个契约;
(3) 类似于接口隔离原则,可以随时修改服务类型的实现而不影响其它实现;
(4) 便于制定版本升级策略,新、旧版本的服务契约可以同时使用而互不影响。
在WCF中,对于自承载的服务,端点的相关的信息可以有代码实现与配置文件两种定义方式。而对于IIS承载服务,端点的相关的信息一般定义在虚拟根目录下的Web.Config文件中。一般来讲,使用配置文件来定义端点相关信息是更为灵活、更为推荐的一种方式,其可以在不修改代码、不重新发布系统的情况下对服务的地址、绑定和契约等参数进行修改(因为修改config类型文件的内容是不需要重新编译和重新部署的)。
在下面的代码中具体说明了如何定义宿主端的端点相关信息。其中地址为http://localhost:8080/HelloService,契约为WCFServiceHello命名空间下的IHello接口,绑定采用的是WSHttpBinding方式。值得注意的是,代码中的HelloService为相对地址,http://localhost:8080/提供的是基址,当然去掉基址直接将address设为http://localhost:8080/HelloService也是可以的。代码中还添加了名为MyServiceTypeBehaviors的行为配置,其将serviceMetadata节中的httpGetEnabled属性设为了true,目的是为了自动透过 HTTP-GET发布服务的元数据。WCF提供的另外一种发布元数据的方式是使用专门的 MEX 端点。
&configuration&
&system.serviceModel&
&services&
&service name=&WCFServiceHello.HelloWorld&
behaviorConfiguration=&MyServiceTypeBehaviors& &
&endpoint contract=&WCFServiceHello.IHello&
binding=&wsHttpBinding&
address=&HelloService&/&
&baseAddresses &
&add baseAddress=&http://localhost:8080/&/&
&/baseAddresses&
&/service&
&/services&
&behaviors&
&serviceBehaviors&
&behavior name=&MyServiceTypeBehaviors& &
&serviceMetadata httpGetEnabled=&true& /&
&/behavior&
&/serviceBehaviors&
&/behaviors&
&/system.serviceModel&
&/configuration&
在接下来的宿主代码中,只需要简单的创建ServiceHost类型的对象,并利用其实例方法Open启动服务应用程序即可,简要代码如下所示:
using(ServiceHost host=new ServiceHost(typeof(WCFServiceHello.HelloWorld)))
Console.WriteLine(&HelloService has been started...&);
host.Open();
Console.ReadKey();
客户端和服务之间通过消息交换来完成方法调用和数据传递,而在 WCF 中定义了3种消息交换模式,如图6所示。
(1) OneWay:这种消息交换模式在调用方法后会立即返回而不需要等待服务端的消息返回。
(2) Request/Reply:这种消息交换模式属于同步调用。在调用服务方法后需要等待服务端的消息返回。
(3) Duplex:这种消息交换模式具有客户端与服务端双向通信的功能,同时它的实现还可以使消息交换具有异步回调的作用。
图6 WCF 中的3种消息交换模式
在设置完宿主端端点之后,同样也必须为分布式应用程序定义客户端的端点,而且只有当客户端的端点与宿主端的某个端点相互匹配时,客户端的请求才能被宿主端所监听到。如果服务提供了发布元数据,那么利用.NET Framework 3.0 SDK所提供的SvcUtil.exe工具可以很轻松的自动生成与宿主端对应的客户端代理以及客户端配置文件。比如,运行宿主端应用程序,然后打开Visual Studio 2005命令提示符,键入SvcUtil http://localhost:8080,便可以在当前目录下得到客户端代理文件HelloWorld.cs与客户端配置文件output.config。另外一种简便直观的可视化工具是SDK 所附带的SvcConfigEditor.exe(C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin目录下,XP系统),使用这个工具可以非常方便地创建或修改宿WCF 能够P2P通讯 或者打洞吗_读书人
WCF 能够P2P通讯 或者打洞吗
&来源:读书人网&【读书人网():综合教育门户网站】
WCF 能够P2P通信 或者打洞吗百度搜了一下 居然看到好多Wcf p2p的东西看了几个 基本上都是如果p2p则双发架
WCF 能够P2P通信 或者打洞吗百度搜了一下&居然看到好多Wcf&p2p的东西看了几个&基本上都是如果p2p则双发架设一个wcf服务端然后双方互相动态连接对方的服务端但是这样在一个网段内能够实现p2p能够实现吗 [解决办法]WCF根本就不是用作那个的,没有任何现有协议支持,你如果要从Socket的层面上去封装WCF底层协议,那就完全失去了使用WCF的最大利处(方便),还要遵循WCF很多限制,得不偿失。[解决办法]p2p可以,打洞不是说不可以,而是你需要自己去扩展它的底层。[解决办法]还有互相架设服务端,这想想都麻烦。[解决办法]三年前试用过WCF的网格网络,记得没有穿透能力,主要是利用网络节点中的广域网节点实现转发。同时还可以利用微软免费提供的服务器,具体的细节不记得了。不过由于效率问题及其引发的无解的奔溃问题,最后不得不放弃了。我们看看不同NAT之间的NAT打洞。NAT打洞需要Server配合,需要2种Server:1. 类似WebRTC中的信令服务器,作用是帮助客户机沟通IP和PORT信息;2. STUN Server,用来让客户机判断自己所在的NAT环境。现在假设客户端和Server的通讯都没问题,客户端知道自己所处环境,并且将自己的信息通过服务器发送给了另一方客户端,它们可能的打洞情况如下:1. Full Cone NAT 与 Full Cone NAT:通讯很容易,各自通过STUN Server获取外部IP和Port后,通过信令服务器通知另一方,即可通讯。2. Full Cone NAT 与 Restricted Cone NAT或Port Restricted Cone NAT在互相告知IP和Port后,如果由Full Cone NAT端先发送数据包,会失败,必须由Restricted Cone NAT或Port Restricted Cone NAT端先发送数据包给Full Cone NAT,之后双方即可互相通讯。3. Full Cone NAT 与 Symmetric NAT通讯时,必须先由Symmetric NAT端发送数据包给Full Cone NAT端,Full Cone NAT端通过发来的数据包获得目标的新端口号,之后通过这个新端口号完成互相通讯。4. Restricted Cone NAT 与 Restricted Cone NAT、Restricted Cone NAT 与 Port Restricted Cone NAT、Port Restricted Cone NAT 与 Port Restricted Cone NAT之间通讯时,先发送数据包的一方会失败,之后另一方发送数据包成功后,可互相通讯。5. Restricted Cone NAT 与 Symmetric NAT通讯时,先由Restricted Cone NAT发送数据包给Symmetric NAT,发送数据会失败,只是为了下次能接收从Symmetric NAT端发送过来的数据包。然后由Symmetric NAT发送数据包到Restricted Cone NAT端,Restricted Cone NAT端会收到数据包,并且将新的端口号记下,使用新的端口号可与Symmetric NAT端通讯。6. Port Restricted Cone NAT 与 Symmetric NAT通讯时,由于Port Restricted Cone NAT会对IP:PORT对进行限制,所以当Symmetric NAT端使用新PORT发来数据包时,Port Restricted Cone NAT端收不到,它们之间无法通讯。7. Symmetric NAT 与 Symmetric NAT也无法通讯 。TCP打洞和UDP打洞的区别 -
- ITeye技术网站
&& 为什么网上讲到的P2P打洞基本上都是基于UDP协议的打洞?难道TCP不可能打洞?还是TCP打洞难于实现?
&&& 假设现在有内网客户端A和内网客户端B,有公网服务端S。
&&& 如果A和B想要进行UDP通信,则必须穿透双方的NAT路由。假设为NAT-A和NAT-B。
&&&
&&& A发送数据包到公网S,B发送数据包到公网S,则S分别得到了A和B的公网IP,
S也和A B 分别建立了会话,由S发到NAT-A的数据包会被NAT-A直接转发给A,
由S发到NAT-B的数据包会被NAT-B直接转发给B,除了S发出的数据包之外的则会被丢弃。
所以:现在A B 都能分别和S进行全双工通讯了,但是A B之间还不能直接通讯。
&&& 解决办法是:A向B的公网IP发送一个数据包,则NAT-A能接收来自NAT-B的数据包
并转发给A了(即B现在能访问A了);再由S命令B向A的公网IP发送一个数据包,则
NAT-B能接收来自NAT-A的数据包并转发给B了(即A现在能访问B了)。
&&& 以上就是“打洞”的原理。
&&& 但是TCP和UDP在打洞上却有点不同。这是因为伯克利socket(标准socket规范)的
API造成的。
&&& UDP的socket允许多个socket绑定到同一个本地端口,而TCP的socket则不允许。
&&& 这是这样一个意思:A B要连接到S,肯定首先A B双方都会在本地创建一个socket,
去连接S上的socket。创建一个socket必然会绑定一个本地端口(就算应用程序里面没写
端口,实际上也是绑定了的,至少java确实如此),假设为8888,这样A和B才分别建立了到
S的通信信道。接下来就需要打洞了,打洞则需要A和B分别发送数据包到对方的公网IP。但是
问题就在这里:因为NAT设备是根据端口号来确定session,如果是UDP的socket,A B可以
分别再创建socket,然后将socket绑定到8888,这样打洞就成功了。但是如果是TCP的
socket,则不能再创建socket并绑定到8888了,这样打洞就无法成功。
浏览 22613
浏览: 181343 次
来自: 成都
要中转服务器把两边内网的设备的外网地址知道就好了,就可以穿透了 ...
为啥打不通呢,前面的所有步骤都执行正确。最后一步Client
写的真棒!解答了我的疑虑,多谢!
复习了,谢楼主!
谢谢!!!!}

我要回帖

更多关于 wcf p2p 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信