好久没有写有关ESFramework
![](/icons/81562de.gif)
文章了
![](/icons/81562dou.gif)
曾很早就承诺过要写
![](/icons/81562yi.gif)
篇介绍基于ESFramework实现NAPT P2P
![](/icons/81562de.gif)
文章
![](/icons/81562dou.gif)
今天终于能抽出时间做这件事
![](/icons/81562dou2.gif)
网络地址转换NAT(或者NAPT)
![](/icons/81562de.gif)
基本理论知识
![](/icons/81562dou.gif)
网上有很多相关资料
![](/icons/81562dou.gif)
不是很清楚
![](/icons/81562de.gif)
朋友可以先了解下什么是NAT、以及为什么要使用NAT
![](/icons/81562dou2.gif)
使用NAT
![](/icons/81562de.gif)
![](/icons/81562yi.gif)
个非常常见
![](/icons/81562de.gif)
场合就是P2P技术
![](/icons/81562dou.gif)
要使两个隐藏在区别
![](/icons/81562de.gif)
局域网后面机器能够相互通信
![](/icons/81562dou.gif)
并不是
![](/icons/81562yi.gif)
件非常简单
![](/icons/81562de.gif)
事情
![](/icons/81562dou.gif)
![](/icons/81562yinwei.gif)
![](/icons/81562dou.gif)
这两台机器没有公网地址
![](/icons/81562dou.gif)
相互的间是无法直接通过IPEndPo
![](/icons/81562int.gif)
访问
![](/icons/81562de.gif)
![](/icons/81562dou2.gif)
NAT解决了这个问题
![](/icons/81562dou.gif)
虽然并不是所有
![](/icons/81562de.gif)
操作系统都完整
![](/icons/81562de.gif)
支持NAT
![](/icons/81562dou.gif)
幸运
![](/icons/81562de.gif)
是
![](/icons/81562dou.gif)
主流
![](/icons/81562de.gif)
操作系统
![](/icons/81562yi.gif)
般都是支持
![](/icons/81562de.gif)
![](/icons/81562dou2.gif)
通常
![](/icons/81562dou.gif)
NAT都支持UDP
![](/icons/81562dou.gif)
支持Tcp
![](/icons/81562de.gif)
NAT实现非常少见(也非常难以实现)
![](/icons/81562dou2.gif)
我们现有
![](/icons/81562de.gif)
P2P技术也几乎全是基于UDP
![](/icons/81562de.gif)
![](/icons/81562dou2.gif)
相互通信
![](/icons/81562de.gif)
两台机器
![](/icons/81562dou.gif)
首先要通过服务器建立起P2P Session
![](/icons/81562dou.gif)
这个过程必须有服务器
![](/icons/81562de.gif)
参和
![](/icons/81562dou.gif)
否则Session无法建立起来
![](/icons/81562dou2.gif)
在P2P Session建立完成的后
![](/icons/81562dou.gif)
两台机器的间就可以进行P2P通信了
![](/icons/81562dou.gif)
而不必再经过服务器中转
![](/icons/81562dou2.gif)
基于ESFramework
![](/icons/81562de.gif)
扩展EsfP2P就是C#版本
![](/icons/81562de.gif)
![](/icons/81562yi.gif)
个P2P实现
![](/icons/81562dou.gif)
它用于协助P2P Session
![](/icons/81562de.gif)
建立
![](/icons/81562dou2.gif)
使用EsfP2P
![](/icons/81562dou.gif)
我们写
![](/icons/81562chengxu.gif)
时不用再关心和如何搭建和P2P Session
![](/icons/81562de.gif)
![](/icons/81562yi.gif)
切事宜
![](/icons/81562dou2.gif)
在P2P Session能被EsfP2P自动建立后
![](/icons/81562dou.gif)
对应
![](/icons/81562de.gif)
IP2PChannel就可以使用了
![](/icons/81562dou.gif)
你还记得IMessageTransceiver吗?IMessageTransceiver
![](/icons/81562de.gif)
智能在于
![](/icons/81562dou.gif)
如果P2PMessage可以通过IP2PChannel直接发送
![](/icons/81562dou.gif)
则将其交给IP2PChannel
![](/icons/81562dou.gif)
否则将其提交给IServerAgent由服务器转发
![](/icons/81562dou2.gif)
这样应用只需要直接使用IMessageTransceiver提交(发送)消息就可以了
![](/icons/81562dou.gif)
而不用关心下层
![](/icons/81562de.gif)
消息路由途径
![](/icons/81562dou2.gif)
回顾
![](/icons/81562yi.gif)
下图示:
![](http://www.crazycoder.cn/WebFiles/20091/36d3f617-56c4-4277-997c-d73f8b33049c.jpg)
当客户端登录时
![](/icons/81562diaoyong.gif)
INaptOutter.P2PLogon思路方法;退出时
![](/icons/81562diaoyong.gif)
INaptOutter.P2PLogout思路方法;GetFriendP2PAddress用于获取所有在线好友
![](/icons/81562de.gif)
P2P地址
![](/icons/81562dou2.gif)
客户端
![](/icons/81562de.gif)
另
![](/icons/81562yi.gif)
个重要组件是P2PSessionChecker
![](/icons/81562dou.gif)
它用于定时向所有在线好友发送P2PCheckMessage(通过
![](/icons/81562diaoyong.gif)
INaptOutter.SendP2PCheckMessage思路方法)
![](/icons/81562dou.gif)
这样那些后上线
![](/icons/81562de.gif)
客户也可以通过这个P2PCheckMessage来判断P2P Session
![](/icons/81562de.gif)
建立
![](/icons/81562dou2.gif)
还有
![](/icons/81562yi.gif)
个客户端
![](/icons/81562de.gif)
消息处理器P2PSessionPassiveDealer
![](/icons/81562dou.gif)
它实现了IDataDealer接口
![](/icons/81562dou.gif)
也是
![](/icons/81562yi.gif)
个简单
![](/icons/81562de.gif)
消息处理器
![](/icons/81562dou.gif)
用于在客户端处理所有和P2P Session搭建相关
![](/icons/81562de.gif)
消息
![](/icons/81562dou2.gif)
有关EsfP2P
![](/icons/81562de.gif)
主要组件就是这些
![](/icons/81562dou.gif)
那么如何使用它来构建P2P应用了?(使用EsfP2P
![](/icons/81562de.gif)
前提是
![](/icons/81562dou.gif)
使用了ESFramework)
(1)首先在
![](/icons/81562yi.gif)
个公共dll中配置P2PSessionMessageType
![](/icons/81562dou.gif)
它将被服务端和客户端使用
![](/icons/81562dou2.gif)
(2)在服务端配置P2PSessionDealer组件
![](/icons/81562dou.gif)
并将其装配到处理器工厂
![](/icons/81562dou2.gif)
(3)在服务端配置UserP2PAddressManager组件
![](/icons/81562dou.gif)
并通过UserP2PAddressManagerBridge桥接UserP2PAddressManager和IUserManager
![](/icons/81562dou2.gif)
(4)在客户端配置NaptOutter组件
![](/icons/81562dou2.gif)
(5)在客户端配置P2PSessionPassiveDealer组件
![](/icons/81562dou.gif)
并将其装配到客户端
![](/icons/81562de.gif)
处理器工厂
![](/icons/81562dou2.gif)
(6)在客户端配置NaptP2PChannelManager组件
![](/icons/81562dou.gif)
并将其装配到IMessageTransceiver组件
![](/icons/81562dou2.gif)
(7)在客户端配置P2PSessionChecker组件
![](/icons/81562dou.gif)
并在登录时
![](/icons/81562diaoyong.gif)
其Initialize思路方法
![](/icons/81562dou2.gif)
EsfP2P.dll可以到ESFramework 可复用
![](/icons/81562de.gif)
应用框架(序)下载部分下载试用
![](/icons/81562dou2.gif)
感谢关注!
延伸阅读
最新评论