文档章节

ProudNet使用方法#5:客户端间的P2P 通信

ProudNet
 ProudNet
发布于 2016/06/17 14:33
字数 1178
阅读 99
收藏 0

ProudNet 介绍
ProudNet是研究游戏软件开发的游戏服务端 &网络引擎。



 

本章对客户端之间的直接通信,即P2P通信进行讲述。

一般P2P连接

1.客户端1与客户端2建立P2P连接。

2.连接成功后客户端1与客户端2之间互发信息。

但是ProudNet并不是如此操作,而是服务器管理客户端之间的连接。这样做的原因是,假如客户端1被黑客攻击的话,连接任何客户端收发信息发生的隐患。

如以下的方式:

1.服务器发送客户端1与客户端2连接的命令。

2.客户端1与客户端2连接到P2P及时响应。

3.客户端1与客户端2之间互发信息。

ProudNet 具有P2P组的概念,P2P组是由HostID识别的对象,P2P组可添加0个以上的客户端,也可添加到服务端。P2P组中客户端之间利用P2P进行通信。

P2P组可自行定义。如:一个聊天室,游戏玩家的房间或者MMO游戏中假领域中的玩家。

当然,一个客户端可进入多个P2P组,重叠也可以。

客户端C1,C2 要建立一个组,参照一下代码。

 

1.  [C++]   

2.  HostID list[2];   

3.  list[0] = C1;   

4.  list[1] = C2;   

5.  G = s->CreateP2PGroup(list, 2); // 第二个要素=数组的大小

6.      

7.  [C#]   

8.  G = s.CreateP2PGroup({C1,C2});

 

 

G中包含了P2P组的HostID,服务器即可使用G。

那么客户端如何知道G存在?调用关联函数如下。

1.  [C++]  

2.  c->Set_OnP2PMemberJoin([...]   

3.      (HostID memberHostID, // [1]  

4.      HostID groupHostID, // [2]  

5.      int memberCount,   // [3]  

6.      const ByteArray &customField)   

7.  {  

8.      G = groupHostID;     // [4]  

9.      Peers.Add(memberHostID);   

10. });  

11.   

12.   

13. [C#]  

14. c.P2PMemberJoinHandler =   

15.     (memberHostID, // [1]  

16.     groupHostID,  // [2]  

17.     memberCount,   // [3]  

18.     customField) =>{   

19.     G = groupHostID; // [4]  

20.     Peers.Add(memberHostID);  

21. };  

 

 

[1]: memberHostID表示指向的主机及本地与P2P的连接。

[2]: memberHostID代表与进入了哪个P2P组。

[3] : P2P组进入多少个主机。

[4]: 要添加代码的部分。需要对“自身在哪个P2P组和此通信的主机是谁”进行保存。

 

客户端收到P2P通信的事件后,客户端即可直接发送给对方P2P信息。

使用SendUserMessage 或者RMI即可。调用SendUserMessage 或者RMI 做为收信对象添加其它主机的HostID即可发送到P2P。假设添加到G,将队G中的所有主机同时发送数据。

1.  [C++]  

2.  c->SendUsermessage(G, RmiContext::ReliableSend, data, length);  

3.   

4.   

5.  [C#]  

6.  c.SendUserMessage(G, RmiContext.ReliableSend, data);

 

 

ProudNet中对P2P组可添加3个以上的客户端。对于已经建立的P2P组,调用 JoinP2PGroup 将更多的主机添加到P2P组。对于新添加的主机和之前建立的主机用OnP2PMemberJoin 事件进行接收。

P2P组中要删除主机调用NetServer.LeaveP2PGroup 即可,要消除P2P组调用DestroyP2PGroup 即可。此时,客户端通过OnP2PMemberLeave 了解“谁离开了”。

即使建立P2P组通知给客户端也要进行打孔。打孔需要几秒时间,在客户端接收信息的期间NetServer 处理延迟,并在后端运行打孔。

打孔成功后通知给客户端, 即OnChangeP2PRelayState事件。

1.  [C++]  

2.  c->Set_OnChangeP2PRelayState([...]   

3.      (HostID remoteHostID, ErrorType reason) // [1]  

4.  {  

5.      ...  

6.  });  

7.   

8.   

9.  [C#]  

10. c.ChangeP2PRelayStateHandler =   

11.     remoteHostID, reason) =>{  // [1]  

12.     ...  

13. };   

 

 

[1]:客户端打孔状态发生了何种改变,并且告知改变的状态。假设 reason=Ok 代表打孔成功,其它值代表打孔消失,显示如何消失的状态。

要想利用RMI进行P2P通信,将proxy和stub 附加到所有的NetClient 中。如下所示:

1.  [MyGame.pidl]   

2.      

3.  global MyGameP2P  //[1]  

4.  {   

5.      Player_Move([in] Vector3 position);   

6.  }   

7.      

8.      

9.  [C++]   

10. MyGameP2P:: Proxy P2PProxy;  //[2]  

11. MyGameP2P::StubFunctional P2PStub;   

12.     

13. P2PStub.Player_Move_Function = [...]PARAM_MyGameP2P_Player_Move{  //[3]  

14.     ...   

15. };   

16.     

17. c->AttachProxy(& P2PProxy);  //[4]  

18. c->AttachStub(& P2PStub);   

19.   

20. P2PProxy.Player_Move(G, RmiContext::UnreliableSend, myPosition); // [5]  

21.     

22.     

23. [C#]   

24. MyGameP2P.Proxy P2PProxy;  //[2]  

25. MyGameP2P.Stub P2PStub;   

26.     

27. P2PStub.Player_Move = (sendFrom, rmiContext, position)=>{  //[3]  

28.     ...   

29. };   

30.     

31. c.AttachProxy(P2PProxy);  //[4]  

32. c.AttachStub(P2PStub);   

33.   

34. P2PProxy.Player_Move(G, RmiContext.UnreliableSend, myPosition); // [5]  

 

 

[1]: 定义P2P通信用RMI.

[2]: P2P RMI的 proxy与 stub的一个实例类.

[3]: 定义P2P接收RMI的处理函数.使用者自行定义.

[4]: 附加[2] 的实例到NetClient 。

[5]: 对P2P 客户端远程调用.

 

总结:

1.创建P2P组直接通信的CreateP2PGroup。

2. 通过OnP2PMemberJoin了解客户端之间的P2P通信。

3. RMI或者SendUserMessage 发送P2P信息。

4.  要使用P2P RMI的话Proxy与Stub都要附加到NetClient。

© 著作权归作者所有

ProudNet
粉丝 11
博文 9
码字总数 9624
作品 0
其它
私信 提问
【ProudNet】服务器引擎之艰难困苦的开发历程

摘要:游戏服务器开发,那些棘手的问题,是如何得到解决的? ProudNet 基于长时间技术积累和众多成功游戏产品和中国及全球范围运营经验 适用于各种复杂网络环境和多种游戏类型,简单易用即使...

ProudNet
2016/07/25
4K
9
【采访】韩国游戏服务器引擎开发公司 “Nettention”

在韩国有一个非常著名的游戏服务器引擎。 ● 对于游戏服务器来说经验很重要,那么你们拥有多少经验呢? 游戏服务器的开发始于1997年。我开创了利用Windows服务器的I/O Completion Port制造游...

ProudNet
2016/07/01
2.9K
15
一款高性能游戏服务器引擎的介绍ProudNet

ProudNet是一款游戏开发所需的服务器引擎。对于实时游戏处理通信量大和同时登录用户数多的问题,是在不同网络环境下能够保持其特有稳定性的高性能引擎。 通过视频教程l详细了解ProudNet游戏服...

ProudNet
2016/05/13
1K
1
两台设备时间同步round trip latency (RTT)方式介绍

在游戏开发过程中,会发现很多时候需要两台设备间时间同步进行的情况。 一般情况下,两台设备间时间同步使用round trip latency (RTT)方式 假设有A,B两台设备。 A->B:发送A的系统时间 [1] B-...

ProudNet
2016/05/19
566
0
空想一下openvpn的发展方向

openvpn从2.0开始支持server模式,也就是支持多个client连接,之前都是p2p,仅仅是一对连接,一个客户端对应一个服务器,后来有了server模式后,多个客户端可以连接一个服务器,那么随后呢,...

晨曦之光
2012/04/10
326
0

没有更多内容

加载失败,请刷新页面

加载更多

好程序员web前端教程分享web前端入门基础知识

  好程序员web前端教程分享web前端入门基础知识,作为合格的Web前端工程师必须得掌握HTML、CSS和JavaScript。只懂其中一两个还不行,必须对这三门语言都要熟悉。下面我们一起来看一看吧! ...

好程序员官网
10分钟前
2
0
elasticsearch 中文分词插件IK-Analyze

elasticsearch 版本 7.3 安装中文分词插件 插件对应的版本需要和elasticsearch的版本一致 插件各个版本下载地址 https://github.com/medcl/elasticsearch-analysis-ik/releases 使用elastic...

kdy1994
14分钟前
3
0
只用一套解决方案,就可解决80%的交通物流行业信息难题

行业背景 新中国成立70多年来,中国交通运输总体上已经形成了多节点、全覆盖的综合运输网络,“五纵五横”综合运输大通道基本贯通,一大批综合客运、货运枢纽站场(物流园区)投入运营,取得...

朕想上头条
16分钟前
4
0
spring-boot结合AOP实现数据源动态配置

Spring-Boot+AOP方式实现多数据源切换 设计总体思路:Spring-Boot+AOP方式实现多数据源切换,继承AbstractRoutingDataSource实现数据源动态的获取,在service层使用注解指定数据源。 一、多数...

蜗牛伊
17分钟前
3
0
干货 | 京东技术中台的Flutter实践之路

在 2019 年,Flutter 推出了多个正式版本,支持的终端越来越多,使用的项目也越来越多。Flutter 正在经历从小范围尝鲜到大面积应用的过程,越来越多的研发团队加入到 Flutter 的学习热潮中,...

京东云技术新知
20分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部