运行环境,客户端一般编译为.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结果会有点区别。

附:演示代码下载点我

游戏编程系列[1]--游戏编程中RPC协议的使用[3]--体验的更多相关文章

  1. WCF编程系列(六)以编程方式配置终结点

    WCF编程系列(六)以编程方式配置终结点   示例一中我们的宿主程序非常简单:只是简单的实例化了一个ServiceHost对象,然后调用open方法来启动服务.而关于终结点的配置我们都是通过配置文件来 ...

  2. Java并发编程系列-(1) 并发编程基础

    1.并发编程基础 1.1 基本概念 CPU核心与线程数关系 Java中通过多线程的手段来实现并发,对于单处理器机器上来讲,宏观上的多线程并行执行是通过CPU的调度来实现的,微观上CPU在某个时刻只会运 ...

  3. 游戏编程系列[1]--游戏编程中RPC协议的使用

    RPC(Remote Procedure Call Protocol)--远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些传输协议的存在 ...

  4. java并发编程系列原理篇--JDK中的通信工具类Semaphore

    前言 java多线程之间进行通信时,JDK主要提供了以下几种通信工具类.主要有Semaphore.CountDownLatch.CyclicBarrier.exchanger.Phaser这几个通讯类 ...

  5. 学习ASP.NET Core Blazor编程系列十——路由(中)

    学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...

  6. 游戏编程系列[2]--游戏编程中RPC与OpLog协议的结合--序

    在系列[1]中,我们展示了RPC调用协议的定义以及演示,通过方法定义以及协议约定,进行了协议约定以及调用过程的约定.然而,实际上在游戏中,调用过程之后,需要传输相对多的数据给服务端. 常用场景,客户端 ...

  7. 游戏编程系列[1]--游戏编程中RPC协议的使用[2]--Aop PostSharp篇

    上一篇我们使用了一个通用JSON协议约定来进行达到远程调用的目的.但是从实现上,我们需要不断的在所有的方法上添加拦截,并且判断拦截,然后执行,这就达到了一个比较繁琐的目的. 之前我们尝试过使用代码生成 ...

  8. python编程系列---Pycharm快捷键(更新中....)

    以下是我常用到的Pycharm快捷键(还有很多,只是我暂时用的最多的就这些): 在开发过程中,经常使用一些快捷键会大大提高开发效率,不要因为看这多而不用,常用的就那些,用得多就都记住了,脱离鼠标,逼格 ...

  9. Hadoop中RPC协议小例子报错java.lang.reflect.UndeclaredThrowableException解决方法

    最近在学习传智播客吴超老师的Hadoop视频,里面他在讲解RPC通信原理的过程中给了一个RPC的小例子,但是自己编写的过程中遇到一个小错误,整理如下: log4j:WARN No appenders ...

随机推荐

  1. SQL Server中的高可用性(2)----文件与文件组

        在谈到SQL Server的高可用性之前,我们首先要谈一谈单实例的高可用性.在单实例的高可用性中,不可忽略的就是文件和文件组的高可用性.SQL Server允许在某些文件损坏或离线的情况下,允 ...

  2. 使用C#处理基于比特流的数据

    使用C#处理基于比特流的数据 0x00 起因 最近需要处理一些基于比特流的数据,计算机处理数据一般都是以byte(8bit)为单位的,使用BinaryReader读取的数据也是如此,即使读取bool型 ...

  3. 深入理解DIP、IoC、DI以及IoC容器

    摘要 面向对象设计(OOD)有助于我们开发出高性能.易扩展以及易复用的程序.其中,OOD有一个重要的思想那就是依赖倒置原则(DIP),并由此引申出IoC.DI以及Ioc容器等概念.通过本文我们将一起学 ...

  4. OpenSceneGraph in ActiveX by ActiveQt

    OpenSceneGraph in ActiveX by ActiveQt eryar@163.com Abstract. Qt’s ActiveX and COM support allows Qt ...

  5. javascript arguments(转)

    什么是arguments arguments 是是JavaScript里的一个内置对象,它很古怪,也经常被人所忽视,但实际上是很重要的.所有主要的js函数库都利用了arguments对象.所以agru ...

  6. 如何解决流程开发中SheetRadioButtonList页面取值问题

    分享一个常见的取值问题. 应用场景: SheetRadioButtonList控件,点击其中一项执行事件操作.如果是页面加载的情况下,值就无法取到. 具体原因如下: 我给SheetRadioButto ...

  7. Ubuntu下开启php调试模式,显示报错信息

    在Ubuntu下php的缺省设置是不显示错误信息的,如果程序出错会显示“无法处理此请求的错误提示”,这在开发环境下非常不方便. 其实我们只要编辑下apache的配置文件就好 1.我的apache 配置 ...

  8. Android Bitmap 和 ByteArray的互相转换

    Android Bitmap 和 ByteArray的互相转换 移动平台图像处理,需要将图像传给native处理,如何传递?将bitmap转换成一个 byte[] 方便传递也方便cpp代码直接处理图像 ...

  9. BZOJ 3626: [LNOI2014]LCA [树链剖分 离线|主席树]

    3626: [LNOI2014]LCA Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2050  Solved: 817[Submit][Status ...

  10. 三大框架SSH整合

    三大框架SSH整合 -------------------------------Spring整合Hibernate------------------------------- 一.为什么要整合Hi ...