可靠的P2P通信功能是ESFramework/ESPlus提供的一个基础而又强大的功能,ESFramework 开发手册(04) -- 可靠的P2P详细描述了在客户端如何使用框架提供的这一武器。本文我们则将介绍的重点放到P2P服务端。
P2P服务器用于协助客户端搭建P2P通道。在ESPlus3.0以前的版本中,P2P服务器是集成在服务端Rapid引擎中的。在2012.04.23最新发布的3.0版本中,这种模式依然被支持,而且,ESPlus又提供了另外一种部署模型:独立部署P2P服务器。
1.服务端IRapidServerEngine有一个UseAsP2PServer属性,用于指示服务端是否同时作为P2P服务器运行。如果将该属性设置为true,然后启动服务端,P2P服务器就会被集成在服务端中同时运行起来。
2.集成启动的P2P服务器监听的UDP端口号为当前IRapidServerEngine监听的TCP端口号加1。比如:IRapidServerEngine监听的TCP端口号为4530(通过其Initialize方法初始化时设定),则P2P服务器监听的UDP端口就是4531。如果是服务端使用框架内置的MainServerForm作为主界面显示,将会看到:
3.如果服务端集成启动了P2P服务器,那么客户端不再需要设置IRapidPassiveEngine的P2PServerAddress属性了。客户端将在登录服务端时,发现如果服务端已经集成了P2P服务器,则会自动与集成的P2P服务器建立联系。
4.如果服务端集成启动了P2P服务器,客户端仍然可以设置IRapidPassiveEngine的P2PServerAddress属性。比如,直接将P2PServerAddress设置为集成P2P服务器的地址:
这种情况下,客户端还是会使用服务端集成的P2P服务器。但是,如果将P2PServerAddress设置为其它地址:
那么,客户端就不会再使用服务端集成的P2P服务器,而是转向使用监听在192.168.0.100的4500端口的P2P服务器了,这种情况,就像是使用独立部署的P2P服务器一样了。
我们提供了可独立启动的P2P服务器exe,运行后,显示的界面如下所示:
可以通过配置文件修改要监听的端口号等信息。xml配置文件内容如下所示
Port设定要监听的UDP端口。
MaxLengthOfUserID用于设定UserID的最大长度。由于P2P服务器内部使用的仍然是ESFramework极其消息协议格式,所以MaxLengthOfUserID的值必需与客户端的设定完全一致。(可以参考ESFramework 开发手册(02) -- 基础功能与状态通知)
SecurityLogEnabled用于设定是否开启日志记录。
P2P服务器的界面除了显示监听的UDP端口号之外,还显示了UDP Session会话的个数,以及线程池中可用的空闲线程的个数。
客户端登录时,会与P2P服务器建立UDP Session,完成了必要的通信之后,客户端会主动关闭这个Session。会话个数表示的是当前还未关闭的Session的数量,而不是当前已启动的客户端的数量。
会话个数的值与RapidServerEngine服务端的在线人数的值几乎是没有必然的联系的。
首先,我们将服务端的IRapidServerEngine的UseAsP2PServer属性设为false,表示将要使用独立部署的P2P服务器。
其次,启动P2P服务器。我们可以把P2P服务器部署到不同于RapidServerEngine服务端所在的服务器上。
最后,将客户端IRapidPassiveEngine的P2PServerAddress属性设置为P2P服务器的地址就可以了。
由于P2P服务器消耗的资源非常的小,对服务器配置的要求不是很高。所以,多个RapidServerEngine服务端可以共享一个P2P服务器。特别是在ESPlatform群集中,我们可以部署许多个应用服务器,但是只要部署一个P2P服务器就可以了。
我们只要将服务端的IRapidServerEngine的UseAsP2PServer属性设为false,并将客户端IRapidPassiveEngine的P2PServerAddress属性设置为null,就表示禁用P2P。这样,客户端IRapidPassiveEngine初始化完成后,其P2PController属性的值将为null。
关于ESFramework的任何问题,欢迎联系我们:
电话:027-87638960
Q Q:372841921