发新帖本帖赏金 1.00元(功能说明)我要提问
12下一页
返回列表
打印

ProudNet 使用方法#4:RMI

[复制链接]
1981|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
星运|  楼主 | 2016-10-5 17:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ProudNet是研究游戏软件开发的游戏服务端 &网络引擎。

利用SendUserMessage发送2进制数据 ,在接收端 OnReceiveUserMessage存在手动接收数据的麻烦性。
而使用ProudNet 的RMI功能这一切将变得很方便。RMI可以远程调用函数, 通过对方计算机程序中的特定函数进行远程控制。
就像开发计算机程序,客户端发送给服务器两个值后服务器将求和结果发送给客户端的方式。
定义这些函数,以下代码为定义RMI函数。
1.  global CalcC2S  
2.  {  
3.     RequestAdd([in] int a, [in] int b);  
4.  }  
5.   
6.  global CalcS2C  
7.  {  
8.      ReponseAdd([in] int sum);  
9.  }  


3行,8行代表信息格式化。
以下代码是客户端发信息到服务端的过程。
1.  [C++]  
2.   
3.  CalcC2SProxy.RequestAdd(HostID_Server,RmiContext::ReliableSend,3, 4);  
4.   
5.   
6.   
7.  [C#]  
8.  CalcC2SProxy.RequestAdd(HostID.Server,RmiContext.ReliableSend,3, 4);  


对CalcC2S, CalcS2C的下一章做详细介绍。首先, RequestAdd第一个因素是 “发送给谁”,加入HostID.Server 为发送给服务器。其次,“如何发送”。之前介绍过的RmiContex,然后其他因素是之前RMI定义过的因素。
以上为发送信息的过程。
以下代码为,服务器处理从客户端接收到的信息过程。
1.  [C++]  
2.  CalcC2SStub.RequestAdd_Function=[...]PARAM_CalcC2SStub_RequestAdd {   // [1]
3.      int sum= a + b;  // [2]
4.     CalcS2CProxy.ResponseAdd(remote, RmiContext::ReliableSend,sum);  // [3]
5.  };  
6.   
7.   
8.  [C#]   
9.  CalcC2SStub.RequestAdd =(remote, rmiContext, a, b) {  // [1]
10.     int sum= a + b;  // [2]
11.    CalcS2CProxy.ResponseAdd(remote, RmiContext.ReliableSend,sum);  // [3]
12. };


[1]:客户端发送信息,从远程调用的RequestAdd运行时,加入Lambda表达式的部分。[…]包含了Lambda表达式。
[2]:两个值进行相加。
[3]:服务器远程调用客户端函数。服务器发送给客户端两个值的计算结果。Remote则代表了收信时,发信者的 HostID。
以下代码为,客户端处理接收的信息。
1.  [C++]  
2.  CalcS2CStub.ResponseAdd_Function=[...]PARAM_CalcS2CStub_ResponseAdd {  
3.     print(sum);
4.  };  
5.  
6.  
7.  [C#]  
8.  CalcS2CStub.ResponseAdd =(remote, rmiContext, sum) {  
9.     print(sum);
10. };


以上为全部处理过程。如需要添加更多种类的初始化信息,可以添加定义到RMI函数部分。如想要变更格式化信息时只需修改RMI函数定义的参数。游戏开发过程对上万种信息种类处理将变得容易。
将定义的RMI信息添加到.pid文件,然后再添加至Calc.pid文件中。
然后利用PIDL complier 生成发送和接收信息代码。详细参考链接 guide.nettention.com/cpp_zh
(参考:在linux ProudNet 环境下同样使用PIDL compiler运行)
PIDL complier 生成发信规则和收信规则,发信规则proxy ,收信规则stub.生成 PIDL complier的语言有C++,c#,Java和Unreal Script).
CalcS2CProxy,和CalcS2CStub 进行介绍:
PIDL文件中定义的 CalcC2S, CalcS2C 是RMI函数集合, PIDL compiler 编译后生成以下类。
CalcC2S.Proxy
CalcC2S.Stub
CalcS2C.Proxy
CalcS2C.Stub


分别代表
CalcC2S.Proxy :客户端->服务端的发信类 即,proxy
CalcC2S.Stub : 客户端->服务端的收信类 即,stub
CalcS2C.Proxy:服务端->客户端的发信类 即,proxy
CalcS2C.Stub: 服务端->客户端的收信类 即,stub


客户端只考虑CalcC2S.Proxy和 CalcS2C.Stub,服务端考虑其它所有。
PIDL compiler 生成的类附加至 NetClient和NetServer。附加方式如下。
1.创建类实例。
2.创建的实例用  AttachProxy,AttachStub函数附加。
以下为附加到客户端的代码。
1.  [C++]  
2.  CalcC2S :: ProxyCalcC2SProxy;  
3.  c->AttachProxy(&CalcC2SProxy);  
4.  CalcS2C::StubFunctionalCalcS2CStub;  
5.  c->AttachStub(&CalcS2CStub);  
6.   
7.   
8.  [C#]  
9.  CalcC2S.ProxyCalcC2SProxy;  
10.c.AttachProxy(CalcC2SProxy);  
11. CalcS2C.StubFunctionalCalcS2CStub;  
12.c.AttachStub(CalcS2CStub);  



连接服务器添加登陆功能。
首先,为登陆PIDL文件声明RMI函数,然后向客户端发送登陆请求,服务器处理后进行发出应答,客户端接受后显示结果。代码如下
1.  globalCalcC2S  
2.  {  
3.     RequestLogin([in] string id, [in] string password);  
4.  }  
5.  
6.  globalCalcS2C  
7.  {  
8.     ResponseLogin([in] bool success);  
9.  }  
10.  
11.  
12.[C++]  
13.CalcC2SProxy.RequestLogin(HostID_Server, RmiContext::SecureReliableSend,"john", "marine");  
14.   
15. CalcC2SStub.RequestLogin_Function =[...]PARAM_CalcC2SStub_RequestLogin {  
16.     bool s= false;  
17.     if(id== ... && password == ...)  
18.     {  
19.        s = true;  
20.     }  
21.      
22.    CalcS2CProxy.ResponseLogin(remote, RmiContext::ReliableSend,s);  
23. };  
24.   
25. CalcS2CStub.ResponseLogin_Function =[...]PARAM_CalcS2CStub_ResponseLogin {  
26.    print(success);  
27. };  
28.   
29.   
30. [C#]  
31.CalcC2SProxy.RequestLogin(HostID.Server, RmiContext.SecureReliableSend,"john", "marine");  
32.   
33. CalcC2SStub.RequestLogin = (remote,rmiContext, id, password) => {  
34.     bool s= false;  
35.     if(id== ... && password == ...)  
36.     {  
37.        s = true;  
38.     }  
39.      
40.     CalcS2CProxy.ResponseLogin(remote,RmiContext.ReliableSend, s);  
41. };  
42.   
43. CalcS2CStub.ResponseLogin = (remote,rmiContext, success) {  
44.    print(success);  
45. };  


13行 SecureReliableSend代表已加密方式发送。为了防止黑客而创建的用户名和密码。
总结:
1.PIDL文件定义RMI函数
2.编译,并且构建配置。
3.将生成的 Proxy, Stub附加至 NetClient和NetServer。
4.调用生成的Proxy函数,即可发送信息。
5. 附加生成的Stub函数,即可调用该函数。

打赏榜单

yyy71cj 打赏了 1.00 元 2016-10-20
理由:继续加油,多多分享

评分
参与人数 1威望 +10 收起 理由
yyy71cj + 10 很好的编程领域的展现,继续加油!.

相关帖子

沙发
星运|  楼主 | 2016-10-6 10:40 | 只看该作者
ProudNet是研究游戏软件开发的游戏服务端 &网络引擎。

使用特权

评论回复
板凳
星运|  楼主 | 2016-10-7 11:34 | 只看该作者
十一假期最后一天 好好宅在家里玩游戏

使用特权

评论回复
地板
星运|  楼主 | 2016-10-10 13:22 | 只看该作者
难以想象今天才周一。。。。。。

使用特权

评论回复
5
星运|  楼主 | 2016-10-11 11:43 | 只看该作者
希望对这方面感兴趣的人有所帮助

使用特权

评论回复
6
星运|  楼主 | 2016-10-12 11:25 | 只看该作者
lz不易,还请大家多多关照

使用特权

评论回复
7
星运|  楼主 | 2016-10-13 11:33 | 只看该作者
感谢这个lt给大家提供这么好的交流平台

使用特权

评论回复
8
星运|  楼主 | 2016-10-14 10:42 | 只看该作者
看见函数 我都不知道该怎么形容了

使用特权

评论回复
9
星运|  楼主 | 2016-10-17 11:21 | 只看该作者
貌似和电脑有些关系的我都没什么天赋

使用特权

评论回复
10
星运|  楼主 | 2016-10-18 10:59 | 只看该作者
ProudNet对于无线网络环境下实时游戏具有显著的优势。

使用特权

评论回复
11
星运|  楼主 | 2016-10-19 09:23 | 只看该作者
把看帖回帖的美德发扬光大 嘻嘻

使用特权

评论回复
12
星运|  楼主 | 2016-10-20 09:35 | 只看该作者
希望对这方面感兴趣的人有所帮助

使用特权

评论回复
13
星运|  楼主 | 2016-10-21 11:03 | 只看该作者
还好我有朋友懂 一起研究下

使用特权

评论回复
14
星运|  楼主 | 2016-10-24 11:20 | 只看该作者
早知道这样,就好好学习了

使用特权

评论回复
15
星运|  楼主 | 2016-10-25 14:25 | 只看该作者
游戏开发神马的不是太懂 玩游戏倒是会

使用特权

评论回复
16
星运|  楼主 | 2016-10-26 10:37 | 只看该作者
希望对游戏开发的人有所帮助

使用特权

评论回复
17
yuanquan12345| | 2016-10-26 10:44 | 只看该作者
星运 发表于 2016-10-24 11:20
早知道这样,就好好学习了

现在学习,肯定不晚。

使用特权

评论回复
18
星运|  楼主 | 2016-10-27 11:17 | 只看该作者
明白的朋友举手?、、、、、、

使用特权

评论回复
19
星运|  楼主 | 2016-10-28 12:06 | 只看该作者
ProudNet是研究游戏软件开发的游戏服务端 &网络引擎。

使用特权

评论回复
20
星运|  楼主 | 2016-10-31 14:02 | 只看该作者
希望对这方面感兴趣的人有所帮助

使用特权

评论回复
发新帖 本帖赏金 1.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

38

帖子

0

粉丝