51Testing软件测试论坛
标题: ProudNet 使用方法#4:RMI [打印本页]
作者: 几点几 时间: 2016-10-5 12:45
标题: ProudNet 使用方法#4:RMI
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文件中。
(参考:在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函数,即可调用该函数。
作者: 几点几 时间: 2016-10-6 10:28
ProudNet是研究游戏软件开发的游戏服务端 &网络引擎。
作者: 几点几 时间: 2016-10-7 11:29
十一假期最后一天 好好宅在家里玩游戏
作者: 几点几 时间: 2016-10-10 13:07
难以想象今天才周一。。。。。。
作者: 几点几 时间: 2016-10-11 11:30
希望对这方面感兴趣的人有所帮助
作者: 几点几 时间: 2016-10-12 11:16
lz不易,还请大家多多关照
作者: 几点几 时间: 2016-10-13 11:24
感谢这个lt给大家提供这么好的交流平台
作者: 几点几 时间: 2016-10-13 11:24
希望对这方面感兴趣的人有所帮助
作者: 几点几 时间: 2016-10-14 10:35
看见函数 我都不知道该怎么形容了
作者: 几点几 时间: 2016-10-17 11:08
貌似和电脑有些关系的我都没什么天赋
作者: 几点几 时间: 2016-10-17 11:09
我没什么天赋
作者: 几点几 时间: 2016-10-18 10:51
ProudNet对于无线网络环境下实时游戏具有显著的优势。
作者: 几点几 时间: 2016-10-19 09:15
把看帖回帖的美德发扬光大 嘻嘻
作者: 几点几 时间: 2016-10-20 09:28
希望对这方面感兴趣的人有所帮助
作者: 几点几 时间: 2016-10-21 10:50
还好我有朋友懂 一起研究下
作者: 几点几 时间: 2016-10-24 11:09
早知道这样,就好好学习了
作者: 几点几 时间: 2016-10-25 14:17
游戏开发神马的不是太懂 玩游戏倒是会
作者: 几点几 时间: 2016-10-26 10:24
希望对游戏开发的人有所帮助
作者: 几点几 时间: 2016-10-27 11:11
明白的朋友举手?、、、、、、
作者: 几点几 时间: 2016-10-28 11:55
ProudNet是研究游戏软件开发的游戏服务端 &网络引擎。
作者: 几点几 时间: 2016-10-31 13:53
希望对这方面感兴趣的人有所帮助
欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) |
Powered by Discuz! X3.2 |