基于ESFramework的P2P实现 —— ESFramework扩展之EsfP2P

本文涉及的产品
公网NAT网关,每月750个小时 15CU
简介: 好久没有写关于ESFramework的文章了,曾很早就承诺过要写一篇介绍基于ESFramework实现NAPT P2P的文章,今天终于能抽出时间做这件事。    网络地址转换NAT(或者NAPT)的基本理论知识,网上有很多相关资料,不是很清楚的朋友可以先了解下什么是NAT、以及为什么要使用NAT。

    好久没有写关于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 可复用的应用框架(序) 





    
 

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
目录
相关文章
解决在idea中构建项目出现不能创建java类,只能创建文件的问题~
解决在idea中构建项目出现不能创建java类,只能创建文件的问题~
322 0
|
C# UED 开发者
WPF与性能优化:掌握这些核心技巧,让你的应用从卡顿到丝滑,彻底告别延迟,实现响应速度质的飞跃——从布局到动画全面剖析与实例演示
【8月更文挑战第31天】本文通过对比优化前后的方法,详细探讨了提升WPF应用响应速度的策略。文章首先分析了常见的性能瓶颈,如复杂的XAML布局、耗时的事件处理、不当的数据绑定及繁重的动画效果。接着,通过具体示例展示了如何简化XAML结构、使用后台线程处理事件、调整数据绑定设置以及利用DirectX优化动画,从而有效提升应用性能。通过这些优化措施,WPF应用将更加流畅,用户体验也将得到显著改善。
1147 1
|
12月前
|
监控 关系型数据库 MySQL
一次彻底讲清如何处理mysql 的死锁问题
【10月更文挑战第16天】本文详细介绍了如何处理 MySQL 中的死锁问题,涵盖死锁的概念、原因、检测方法及解决策略,强调通过优化事务设计、调整数据库参数、手动处理和预防措施等手段,有效减少死锁,提升数据库性能与稳定性。
2092 0
|
6天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!
|
17天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1318 7
|
4天前
|
存储 人工智能 Java
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话
本文讲解 Prompt 基本概念与 10 个优化技巧,结合学术分析 AI 应用的需求分析、设计方案,介绍 Spring AI 中 ChatClient 及 Advisors 的使用。
291 128
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话
|
3天前
|
监控 JavaScript Java
基于大模型技术的反欺诈知识问答系统
随着互联网与金融科技发展,网络欺诈频发,构建高效反欺诈平台成为迫切需求。本文基于Java、Vue.js、Spring Boot与MySQL技术,设计实现集欺诈识别、宣传教育、用户互动于一体的反欺诈系统,提升公众防范意识,助力企业合规与用户权益保护。
|
16天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
1386 87