现在我们将在ESFramework Demo -- 文件传送Demo 的基础上,使用ESPlus提供的第四个武器,为其增加P2P通信的功能。在阅读本文之前,请务必先掌握ESFramework
开发手册(04) -- 可靠的P2P 一文中介绍的P2P的基础知识以及相关API的用法。
本Demo主要演示以下功能:
(1)创建基于TCP的P2P通道
(2)创建基于UDP的P2P通道(内部使用可靠的UDP)
(3)使用P2P通道发送消息和传送文件
一.服务端
在P2P打洞的过程中,服务端会参与协助P2P通道的建立,整个过程是由ESFramework/ESPlus内部自动完成的,而这个过程对于框架使用者是透明的。P2P通道创建后,客户端与客户端之间的通信就与服务器没有任何关系了。所以我们直接把上一个demo的服务端拿过来用,不需要做任何修改。
二.客户端
客户端主要使用IRapidPassiveEngine提供的P2PController来查询和控制P2P通道的状态。
尝试创建P2P通道
正如ESFramework 开发手册(04) -- 可靠的P2P 一文中介绍的,并不是所有的客户端之间的P2P通道都可以创建成功,创建P2P通道是一个尝试的过程,IP2PController的P2PConnectAsyn方法就是尝试与目标用户创建P2P通道。
时机很重要。在何时创建P2P通道了?一般而言,是在两个客户端需要高频通信之前,调用P2PConnectAsyn进行尝试创建。
在本Demo中,我们是在每次打开与目标用户的聊天窗口的时候,来尝试创建P2P通道的。如下所示:
使用P2PConnectAsyn方法开始打洞时,若双方位于同一局域网,一般会建立起基于TCP的P2P通道;若双方位于不同的网络,一般会建立起基于UDP的P2P的通道。如果与目标用户之间已经存在可用的P2P通道,则P2PConnectAsyn将不再做任何动作,而直接返回。
为了获得P2P通道创建成功或失败以及后续P2P通道被关闭的通知,demo中我们在MainForm的Initialize方法中预定了P2PController的P2PChannelOpened和P2PChannelClosed事件。
当P2P通道创建成功或被关闭时,本demo通过修改对应聊天窗口的Title文字来显示这种状态。比如,当P2P通道创建成功时,聊天窗口的Title显示如下:
通常,如果两个客户端位于同一个LAN,或者有一个客户端直接位于Internet上,则它们之间的P2P通道是基于TCP的;否则,创建的P2P通道是基于UDP的。
ChatForm提供了ShowP2PChannelState方法来显示与聊天对象之间的P2P通道状态。
请注意,当与目标用户之间没有P2P通道时,P2PController的GetP2PChannelState方法返回的是null。
观察P2P通信
当P2P通道创建成功后,两个用户之间的后续通信将经过P2P通道传送,在本Demo中,表示后续的聊天消息以及文件传送都将通过P2P通道进行。
那么,如何判断消息是通过服务器中转的,还是经过P2P通道直接传送的了?我们常用的有两个简单的方法。
(1)观察服务器的MainServerForm界面。
如果消息是经过服务器中转的,那么界面上显示消息接收者用户对应的“下载数据量”、“请求次数”、“最后一次请求时间”都会跟着发生变化。就本例来说,每当你给对方发送一个聊天消息,如果是经过服务器中转,那么界面上显示的对方的请求次数会增加1,下载数据量也会增大,最后一次请求时间也会变化。而如果消息是通过P2P通道传送的,这些数据就不会受影响。
(2)查看资源监视器
如果是Win7的系统,任务管理器“性能”显示中提供了“资源监视器”,可以监控网络的活动。使用它,我们就可以看到应用程序在和哪些机器进行通信。如下图所示:
上面是我们另一个P2P应用demo的截图,图中59.175.145.163是服务器的IP,而我们看到OMCS.ClientDemo.exe接收数据的主要流量来自于ZY-PC这台电脑,这表示两个客户端之间的数据是经过P2P通道传送的,没有通过服务器中转。之所以图中显示的客户端与服务器之间还有微小的流量,那是由类似定时心跳消息等产生的。
如果不是Win7系统,也可以通过安装网络监控软件(如NetLimitter)来查看这些信息。
三.源码下载
ESFramework.Demos.P2P 源码
阅读
更多ESFramework开发手册系列文章。
-----------------------------------------------------------------------------------------------------------------------------------------------
关于ESFramework的任何问题,欢迎联系我们:
电话:027-87638960
Q Q:372841921
分享到:
相关推荐
PHP实例开发源码—ESFramework之P2P通信Demo php版.zip PHP实例开发源码—ESFramework之P2P通信Demo php版.zip PHP实例开发源码—ESFramework之P2P通信Demo php版.zip
ESFramework系列Demo源码 程序介绍: 本ESFramework系列Demo共有5个Demo。 分别为: 1.ESFramework之入门Demo 2.ESFramework之文件传送Demo 3.ESFramework之P2P通信Demo 4.ESFramework之FTP_Demo 5.ESFramework...
PHP实例开发源码—ESFramework之P2P通信Demo php版.zip
基于PHP的ESFramework之P2P通信Demophp版源码.zip
本demo是在ESFramework.Demos.FileTransfer的基础之上,增加了P2P通信的功能。客户端之间如果P2P通道创建成功,则它们之间的消息将直接使用P2P通道传送。
WebRTC源码,编译完成后计12G。 此为局域网p2p视频通话Demo---WebRTCDemo-debug.apk源码。 包含java源码及JNI源码。 直接导入eclipse即可运行。
本demo是在ESFramework.Demos.FileTransfer的基础之上,增加了P2P通信的功能。客户端之间如果P2P通道创建成功,则它们之间的消息将直接使用P2P通道传送。
本demo是在ESFramework.Demos.FileTransfer的基础之上,增加了P2P通信的功能。客户端之间如果P2P通道创建成功,则它们之间的消息将直接使用P2P通道传送。
Android应用源码开发Demo,主要用于毕业设计学习。
p2p源代码,点对点源代码demo
视频会议,局域网直连(无需服务器),兼容webRTC, 支持webRTC加速,P2P高清传输,安卓、iOS、web互通,支持门禁对讲,可视对讲,电视盒子,树莓派,海思,全志,任天堂switch,云游戏,OTT设备,物联网平台,C语言...
Android应用源码开发Demo,主要用于毕业设计学习。
Java局域网通信——飞鸽传书源代码 28个目标文件 内容索引:JAVA源码,媒体网络,飞鸽传书 Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java...
Java局域网通信——飞鸽传书源代码 28个目标文件 内容索引:JAVA源码,媒体网络,飞鸽传书 Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java...
基于C++的P2PDemo源码(毕业设计 课程设计) 可直接运行。做毕业设计、课程设计或者想研究下技术的可以下载学习。
具有一定的参考意义,是最完善的一个版本,原“基于UDP的P2P小Demo (穿透NAT)delphi源码”是比较粗糙的老版,此版是原作者改进后的。
具有文字聊天和传文件的功能,没有使用Indy网络控件,直接用的WinsockAPI。传文件用的也是UDP,还不会TCP穿透的说-_-!,用了简单的重传机制。 请把Server放在公网上,Client放在内网来测试,否则就没有穿透的...
p2p网络下的应用程序开发Demo,简单了解p2p的连接过程和技术原理。
P2P穿透NAT源代码,经过修改在delphi2007上可以正常编译运行。实现了udp Nat穿透,简单易懂
Android-NFC P2P学习源码,非常实用的~