zoukankan      html  css  js  c++  java
  • 游戏编程系列[1]--游戏编程中RPC协议的使用[3]--体验


    运行环境,客户端一般编译为.Net 3.5 Unity兼容,
    服务端因为用了一些库,所以一般为4.0 或往上。
    同一份代码,建立拥有2个项目。
    客户端引用: WindNet.Client
    服务端引用: OpLog.Core WindNet.Web

    然后服务端添加编译标记为SV

    看代码:

        //PostSharp AOP标记 拥有此标记的方法将可以远程调用
            [TypeProxy]
            public class LocalTest
            {
    
                //callback为必须,如果没有此方法,则不可进行远程调用
                //远程调用模式中
                // var xx =  LocalTest.StaticCallTest 这种调用方式是错误的。
                // var xx =  LocalTest.StaticCallTest 这种调用方式是错误的。
                // var xx =  LocalTest.StaticCallTest 这种调用方式是错误的。
                public static string StaticCallTest(string arg1, Action<string> callback = null)
                {
                    return arg1 + "callback";
                }
            }
    

      

    一个静态的类,并且有个方法,我们要做的就是,让这个StaticCallTest在远程返回然后在本地执行callback

            static void Main(string[] args)
            {
    #if SV  //SV标记为服务端代码,客户端不执行
                WebHost.Start();
                Console.ReadLine();
    
    #else  //客户端代码,服务端并不执行
                //默认输出到控制台
                DebugHelper.ConsoleOut = true;
                //注册入口类型以及对应的程序集,防止找不到对应的类 只需要启动时注册一次
                WindNet.RemoteCall.Instance.RegTypes(typeof(Program));
    
                //关闭标记,默认为远程RPC请求
                WindNet.RemoteCall.Instance.IsLocal = false;
    
                //执行一个方法
                //本地方法会立刻返回
                //远程执行 因为直接返回 所以结果是错误的,返回值不可用
                // var xx =  LocalTest.StaticCallTest 这种调用方式是错误的。
                var xx=  LocalTest.StaticCallTest("hello world!", (r) =>
                {
                    Console.WriteLine(r);
                });
                //本地执行 xx 为正确
                //远程执行 xx 为空
                Console.WriteLine("Print xx:" + xx);
                if (!WindNet.RemoteCall.Instance.IsLocal)
                {
                    //一般情况下,我们需要一个CallLoop挂在主线程上,用于执行回调,和添加请求
                    //这里的CallLoop是默认挂在主线程上处理请求,实际上不能这么干
                    //请求
                    WindNet.RemoteCall.Instance.CallLoop();
                    //获得返回 执行回调
                    WindNet.RemoteCall.Instance.CallLoop();
                }
    #endif
    
    
                Console.ReadLine();
            }
    

      

    1.WebHost 内部使用的Cassini的一个内嵌的Web服务器,实际部署可以通过IIS,仅为测试使用。
    2.默认端口 4570
    3.这部分代码仅仅是原框架抽取并不完善,所以也仅供演示。
    4.性能通过反射问题不是很大,客户端和服务端都是(服务端是加速过的,比客户端快10x)
    5.后续会有非静态方法的演示。
    6.GameLib.exe 客户端 GameLibSV.exe 服务端
    7.本方案已经有上线项目使用,WindNet.Client 兼容IOS/安卓/UWP IL2CPP版本
    8.需安装PostSharp才能正常使用,不愿意装直接运行即可。无PostSharp结果会有点区别。


    附:演示代码下载点我

  • 相关阅读:
    LeetCode 43 字符串相乘
    HDU 1031 Design T-Shirt
    HDU 1728 逃离迷宫
    HDU 1285 确定比赛名次
    HDU 1116 Plays on words
    HDU 1195 Open the lock
    HDU 1072 Nightmare
    HDU 1272 小希的迷宫
    HDU 1273 漫步森林
    HDU 1269 迷宫城堡
  • 原文地址:https://www.cnblogs.com/icesun963/p/6255306.html
Copyright © 2011-2022 走看看