游戏编程系列[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结果会有点区别。
附:演示代码下载点我