zhuweisky
君子之行,静以修身,俭以养德。非淡泊无以明志,非宁静无以致远。
ESFramework,基于.NET的通信框架。DataRabbit,轻量的数据访问框架。sky.zhuwei@163.com
posts - 191, comments - 1276, trackbacks - 94, articles - 1
博客园
::
首页
::
新随笔
::
联系
::
订阅
::
管理
ESFramework扩展之EsfP2P -- 基于ESFramework的P2P实现
Posted on 2006-08-15 15:40
zhuweisky
阅读(3558)
评论(4)
编辑
收藏
所属分类:
ESFramework
好久没有写关于ESFramework的文章了,曾很早就承诺过要写一篇介绍基于ESFramework实现NAPT P2P的文章,今天终于能抽出时间做这件事。
网络地址转换NAT(或者NAPT)的基本理论知识,网上有很多相关资料,不是很清楚的朋友可以先了解下什么是NAT、以及为什么要使用NAT。使用NAT的一个非常常见的场合就是P2P技术,要使两个隐藏在不同的局域网后面机器能够相互通信,并不是一件非常简单的事情,因为,这两台机器没有公网地址,相互之间是无法直接通过IPEndPoint访问的。NAT解决了这个问题,虽然并不是所有的操作系统都完整的支持NAT,幸运的是,主流的操作系统一般都是支持的。
通常,NAT都支持UDP,支持Tcp的NAT实现非常少见(也非常难以实现)。我们现有的P2P技术也几乎全是基于UDP的。
相互通信的两台机器,首先要通过服务器建立起P2P Session,这个过程必须有服务器的参与,否则Session无法建立起来。在P2P Session建立完成之后,两台机器之间就可以进行P2P通信了,而不必再经过服务器中转。
基于ESFramework的扩展EsfP2P就是C#版本的一个P2P实现,它用于协助P2P Session的建立。使用EsfP2P,我们写程序时不用再关心与如何搭建与P2P Session的一切事宜。
在P2P Session能被EsfP2P自动建立后,对应的IP2PChannel就可以使用了,你还记得
IMessageTransceiver
吗?IMessageTransceiver的智能在于,如果P2PMessage可以通过IP2PChannel直接发送,则将其交给IP2PChannel,否则将其提交给IServerAgent由服务器转发。这样应用只需要直接使用IMessageTransceiver提交(发送)消息就可以了,而不用关心下层的消息路由途径。
回顾一下图示:
ESFramework的扩展之一NaptP2P,就是用于自动搭建各个IP2PChannel,并使之可用。一旦Client1和Client2之间的IP2PChannel构建成功,它们之间的通信就可以直接进行。
说了这么久的EsfP2P,对其还没有感性的认识。下面我们来详细介绍它。
EsfP2P的主要目的是协助P2P Session的搭建(即各个IP2PChannel实例的构建),这需要客户端和服务端相互协作来完成这件事情。
关于NAT的“hole”(“打洞”)过程以建立P2P Session的理论,可参阅其它相关资料(如
http://hwycheng.blogchina.com/
)。这里列出EsfP2P采用的“hole”过程:
(1)服务器管理所有在线用户的Udp地址
(2)ClientA登录时从服务器获取所有在线好友的Udp地址列表
(3)ClientA初始化时,根据好友地址列表向所有在线好友发送P2PCheckMessage
(4)以后ClientA定时向NaptP2PChannelManager管理的各个通道发送DirectP2PCheck消息
(5)当某个Client收到P2PCheckMessage,则将对应的用户注册到NaptP2PChannelManager
(6)当某个Client上线时,服务器通知所有其它用户,用户接到通知后,立即向该Client发送P2PCheckMessage
(7)当某个Client下线/掉线时,服务器通知所有其它用户,用户接到通知后,从NaptP2PChannelManager中注销下线的用户
EsfP2P通过执行上述的要点,可以保证P2P Session的正确建立。在实现这些要点时,需要引入一系列类型的消息,这些消息类型可由P2PSessionMessageType的属性展现:
AskForFriendP2PAddresses消息用于客户端向服务器请求所有好友的P2P地址;P2PCheckMessage用于Check两个端点之间的P2P Session是否成功建立,一旦一个端点接收到了另一个端点发来的P2PCheckMessage,就说明两个端点之间的P2P Session已经建立成功了。P2PLogon和P2PLogout是客户端登陆或退出时发送给服务器的消息。SomeOneLogon和SomeOneLogout是当某个用户上线、下线时,服务器给其它用户的通知。
EsfP2P中分别提供了对服务端(EsfP2P.Server空间)和客户端(EsfP2P.Passive空间)的支持。在服务端,主要是P2PSessionDealer组件,UserP2PAddressManager组件。
P2PSessionDealer实现了IDataDealer接口,是一个简单的消息处理器,用于处理所有与P2PSession创建相关的消息,如AskForFriendP2PAddresses消息、P2PLogon和P2PLogout。
UserP2PAddressManager用于管理所有客户的P2P地址,并且当某用户上/下线时,要发送SomeOneLogon和SomeOneLogout消息通知这个用户的好友。其接口IUserP2PAddressManager类图如下:
IUserP2PAddressManager 既可用于服务端、也可用于客户端:
(1)在服务端主要被P2PSessionDealer填充,另外用户掉线事件也应触发UnRegister调用
(2)在客户端主要被P2PSessionPassiveDealer填充,另外用户离线事件也应触发UnRegister调用
下面看EsfP2P对客户端的支持。
客户端的核心接口是INaptOutter,它封装了所有与服务端或其它客户端进行有关NAPT Session的交互。
当客户端登录时调用INaptOutter.P2PLogon方法;退出时调用INaptOutter.P2PLogout方法;GetFriendP2PAddress用于获取所有在线好友的P2P地址。
客户端的另一个重要组件是P2PSessionChecker,它用于定时向所有在线好友发送P2PCheckMessage(通过调用INaptOutter.SendP2PCheckMessage方法),这样那些后上线的客户也可以通过这个P2PCheckMessage来判断P2P Session的建立。
还有一个客户端的消息处理器P2PSessionPassiveDealer,它实现了IDataDealer接口,也是一个简单的消息处理器,用于在客户端处理所有与P2P Session搭建相关的消息。
关于EsfP2P的主要组件就是这些,那么如何使用它来构建P2P应用了?(使用EsfP2P的前提是,使用了ESFramework)
(1)首先在一个公共dll中配置P2PSessionMessageType,它将被服务端和客户端使用。
(2)在服务端配置P2PSessionDealer组件,并将其装配到处理器工厂。
(3)在服务端配置UserP2PAddressManager组件,并通过UserP2PAddressManagerBridge桥接UserP2PAddressManager与IUserManager。
(4)在客户端配置NaptOutter组件。
(5)在客户端配置P2PSessionPassiveDealer组件,并将其装配到客户端的处理器工厂。
(6)在客户端配置NaptP2PChannelManager组件,并将其装配到IMessageTransceiver组件。
(7)在客户端配置P2PSessionChecker组件,并在登录时调用其Initialize方法。
EsfP2P.dll可以到
ESFramework 可复用的应用框架(序)
下载部分下载试用。
感谢关注!
转到 :
ESFramework 可复用的应用框架(序)
Feedback
#1楼
回复
引用
2006-08-15 21:51 by
netx [未注册用户]
继续学习LZ的ESFramework
#2楼
回复
引用
查看
2006-08-16 08:47 by
史上最菜鸟
其实zhuweisky 大大的文章写得不少了。
如果能多点例子的话就更好了。
#3楼
回复
引用
2006-08-16 09:50 by
weejie [未注册用户]
是啊,不知道esframework3.0什么时候能发布啊
#4楼
回复
引用
2007-08-07 06:09 by
王琳 [未注册用户]
能给我一份ESFramework的开源代码吗,让我学习学习
新用户注册
刷新评论列表
标题
姓名
主页
Email
(博主才能看到)
验证码
*
看不清,换一张
[
登录
][
注册
]
内容(请不要发表任何与政治相关的内容)
网站首页
新闻频道
社区
小组
博问
网摘
闪存
找找看
Remember Me?
登录
使用高级评论
新用户注册
返回页首
恢复上次提交
[使用Ctrl+Enter键可以直接提交]
该文被作者在 2006-09-07 09:50 编辑过
Google站内搜索
相关文章:
程序人生--一个程序员对学弟学妹建议(转)
程序人生--一个程序员对学弟学妹建议(转)
ESFramework网络通信框架 -- 序
关于P2P穿越NAT/防火墙的困惑
阿里巴巴切入P2C
关于MVC的文件结构--多语、多功能网站
简单的P2P聊天
壮志篇--铿锵玫瑰
学校--政治.企业?
相关链接:
所属分类的其他文章:
ESFramework3.0 Demo源码
ESFramework V2.0 Beta 发布
ESFramework扩展之EsfFTP -- 基于ESFramework的FTP服务
ESFramework 1.0 示例源码
ESFramework V1.0 Beta 发布!
ESFramework扩展之EsfP2P -- 可靠的P2P传递
ESFramework 最新进展 -- ESFramework体系 2006.08.25
ESFramework扩展之EsfP2P -- 基于ESFramework的P2P实现
给关注ESFramework的朋友们 2006.06.25
ESFramework介绍之(35)―― IMessageTransceiver
最新IT新闻:
微型博客Twitter取消IM服务 称其ROI差
用手机聊Gtalk的方法以及应用总结
Google开拓美政府机构市场 微软业务受冲击
消息称苹果正在开发iTunes网络电视
微软周一开电话会议 预计将发布Silverlight2.0
Powered by:
博客园
Copyright © zhuweisky
日历
<
2006年8月
>
日
一
二
三
四
五
六
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
公告
 
气度影响格局
性格决定命运
  正在阅读的书籍:
与我互动
给我发短消息
搜索
留言簿
(63)
给我留言
查看私人留言
随笔分类
(192)
C#专栏(37)
DataRabbit(19)
DTS(11)
Emit(7)
ESFramework(54)
sky随笔(11)
Strive Game Engine(2)
Web开发(6)
分布式(12)
高性能(1)
管理实践(7)
技术随笔(15)
系统架构/EAI、SOA(10)
随笔档案
(191)
2008年9月 (6)
2008年8月 (2)
2008年6月 (2)
2008年5月 (5)
2008年4月 (4)
2008年3月 (1)
2007年12月 (1)
2007年11月 (2)
2007年9月 (2)
2007年8月 (3)
2007年7月 (1)
2007年6月 (1)
2007年5月 (2)
2007年4月 (6)
2007年3月 (17)
2007年2月 (1)
2007年1月 (1)
2006年12月 (3)
2006年11月 (4)
2006年9月 (5)
2006年8月 (2)
2006年7月 (9)
2006年6月 (6)
2006年5月 (19)
2006年4月 (18)
2006年3月 (27)
2006年2月 (4)
2006年1月 (4)
2005年12月 (10)
2005年11月 (2)
2005年10月 (1)
2005年9月 (20)
收藏夹
(20)
ASP.Net(5)
Java技术(3)
Linux(4)
SOA(1)
UML(1)
安全(2)
高级.NET(2)
历史(2)
好友博客
Donald
Ivan Zou
wwp
嘟嘟的博客
技术网站
C#3.0
CodeDOM
CodeProject
CSharpCorner
Linux时代
博客堂
寸锐斋
优秀blog专栏
BlueDavy Java
Don Box
mulder 的程序人生
shanyou
跋涉前行-P2P的思考与探索
寸锐斋
故步自封
花钱的年华
李维
梦想风暴
思归呓语
透明思考
王垠blog
云风
积分与排名
积分 - 461833
排名 - 44
最新评论
1. re: .NET Remoting与双网卡
<channel ref="tcp" port="9000" bindto="ip地址" >
--小徐小
2. re: 反射中使用 BindingFlags.IgnoreCase
thx for help
--amingo
3. re: ESFramework3.0 Demo源码
跟ESF一起成长了两年,一直想用ESF做点东西,可是那是不现实的,ESF只是一个很空的框架,框架都算不上只能说是思想或是秀招,完全不能实战的东西。本来花了很多精力写些插件,但这次跟微软合作,我真的只花...
--冰品羽扇
4. re: 【Emit基础】在IL中进行异常处理
这一系列文章挺好,就是每篇的内容少了点
--Terry Sun
5. re: 【Emit基础】在IL中进行异常处理
看看
--hahahehe
6. re: .NET Remoting与双网卡
我觉得这种做法不是很好,最好是使用bindTo属性绑定一个网卡 MSDN上这样说的 machineName:指定用于当前信道的计算机名称的字符串。如果用于服务器信道,则重写 useIpAddress。...
--wuqiubin
7. re: 【Emit基础】调用Tostring()方法的IL表示
@Q.Lee.luluEmit是dotnet的一种很强大的功能。你可以用它在运行时生成代码。你可以在System.Reflection.Emit下面找到关于它的类和方法。使用Emit的前提是必须了解I...
--胖胖de程序员
8. re: 【Emit基础】调用Tostring()方法的IL表示
Emit是啥 ?
--Q.Lee.lulu
9. re: System.AccessViolationException: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
这个问题,一般是由于某些地方存在 内存泄漏引起(不是内存用的多而是泄漏)
以前用 Access oledb 操作写一些比较复杂 sql 经常出现;
--曲滨*銘龘鶽
10. re: System.AccessViolationException: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
碰到过 当时有一个页面每次在我的机器上打开的时候都报这个错 别的机器没事。很急人 就是不知道为什么 ,后来干脆就不管他了。你写的有点深奥 看不懂。...
--Wuya.net
阅读排行榜
1. ESFramework网络通信框架 -- 序(17490)
2. Java -- 在Eclipse上使用XFire开发WebService(13296)
3. 路径规划(最短路径)算法C#实现(9859)
4. Java -- 在Eclipse上使用Hibernate(7655)
5. AgileIM 源码公开(7562)
6. 我的架构经验小结(三)-- 深入三层架构(6507)
7. DataRabbit 轻量的ORM框架(00) -- 序(6319)
8. 做一个合格的Team Leader -- 基本概念(5802)
9. ESFramework介绍之(6)―― 基于C/S的4层架构概述(5589)
10. 动态调用web服务(5312)
评论排行榜
1. ESFramework网络通信框架 -- 序(76)
2. AgileIM 源码公开(43)
3. DataRabbit 轻量的ORM框架(00) -- 序(38)
4. 写书计划启动!《.NET通信框架的设计、实现与应用》(31)
5. 总裁与专才(30)
6. 函数设计之美--函数需要返回错误码吗(一)?(29)
7. 基于Web的IM实现思考(29)
8. ESFramework V2.0 Beta 发布(25)
9. 路径规划(最短路径)算法C#实现(24)
10. 框架?(24)
60天内阅读排行
1. System.AccessViolationException: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。 (1830)
2. 【Emit基础】在IL中进行异常处理(1349)
3. ESFramework3.0 Demo源码(1222)
4. 【Emit基础】调用Tostring()方法的IL表示(1136)
5. 【Emit基础】OpCodes.Ldind_Ref 和 OpCodes.Ldind_I*(527)
6. 【Emit基础】IL定义方法的语法详解(119)
7. 【Emit基础】IL中发布、订阅、触发事件(67)