51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 4772|回复: 28
打印 上一主题 下一主题

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

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2016-11-1 12:46:35 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
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.      (HostIDmemberHostID, // [1]  
4.      HostIDgroupHostID, // [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.      (HostIDremoteHostID, 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.  globalMyGameP2P  //[1]  
4.  {   
5.     Player_Move([in] Vector3 position);   
6.  }   
7.      
8.      
9.  [C++]   
10. MyGameP2P:: ProxyP2PProxy;  //[2]  
11. MyGameP2P::StubFunctionalP2PStub;   
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.ProxyP2PProxy;  //[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。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

  • TA的每日心情

    2019-12-27 13:32
  • 签到天数: 15 天

    连续签到: 1 天

    [LV.4]测试营长

    推荐
    发表于 2016-11-17 22:11:36 | 只看该作者
    几点几 发表于 2016-11-17 12:21
    希望对感兴趣的人有所帮助

    你好 有qq联系方式吗  可以加下我 728661182
    回复 支持 1 反对 0

    使用道具 举报

  • TA的每日心情
    开心
    2016-8-2 00:34
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]测试小兵

    28#
    发表于 2016-12-15 19:34:58 | 只看该作者
    好专业!这个比较不错!谢谢楼主!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    27#
    发表于 2016-12-5 11:38:29 | 只看该作者
    新的一天,新的开始。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    26#
    发表于 2016-12-2 09:48:19 | 只看该作者
    看起来不错,有兴趣的可以了解下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    25#
    发表于 2016-12-1 11:25:26 | 只看该作者
    专业术语啊,听不太懂,嘿嘿嘿
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    24#
    发表于 2016-11-30 15:58:18 | 只看该作者
    好多的代码
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    23#
    发表于 2016-11-29 10:59:28 | 只看该作者
    感兴趣的看看吧
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    22#
    发表于 2016-11-28 11:29:21 | 只看该作者
    看起来很专业么
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    21#
     楼主| 发表于 2016-11-25 09:12:52 | 只看该作者
    希望对感兴趣的人有所帮助
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    20#
     楼主| 发表于 2016-11-24 13:22:32 | 只看该作者
    支持一下,有需要的朋友别错过哦
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    19#
     楼主| 发表于 2016-11-23 11:14:55 | 只看该作者
    ProudNet为开发提供更有效的解决方案和市场分析在进行此问卷调查
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    18#
     楼主| 发表于 2016-11-22 11:36:03 | 只看该作者
    ProudNet是研究游戏软件开发的游戏服务端 &网络引擎。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    17#
     楼主| 发表于 2016-11-21 12:01:03 | 只看该作者
    又是一周过去了 几个使用方法都学会了吗
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    16#
     楼主| 发表于 2016-11-18 11:28:48 | 只看该作者
    肯定会有人觉得这像天文数字
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    14#
     楼主| 发表于 2016-11-17 12:21:25 | 只看该作者
    希望对感兴趣的人有所帮助
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
     楼主| 发表于 2016-11-16 15:05:05 | 只看该作者
    今天是个适合学习的好天气
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    12#
     楼主| 发表于 2016-11-15 13:28:54 | 只看该作者
    有时间的时候会多问问朋友关于软件开发的游戏服务端
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    11#
     楼主| 发表于 2016-11-14 13:35:34 | 只看该作者
    双十一凑什么热闹 还是看看游戏有没有什么活动才是王道
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-9 09:22 , Processed in 0.075491 second(s), 24 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表