游戏编程系列[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结果会有点区别。


附:演示代码下载点我

原文地址:https://www.cnblogs.com/icesun963/p/6255306.html