ProudNet 使用方法#4:RMI
  • 浏览:725 评论:18 人
  • 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函数,即可调用该函数。