游戏编程系列[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结果会有点区别。
附:演示代码下载点我
游戏编程系列[1]--游戏编程中RPC协议的使用[3]--体验的更多相关文章
- WCF编程系列(六)以编程方式配置终结点
WCF编程系列(六)以编程方式配置终结点 示例一中我们的宿主程序非常简单:只是简单的实例化了一个ServiceHost对象,然后调用open方法来启动服务.而关于终结点的配置我们都是通过配置文件来 ...
- Java并发编程系列-(1) 并发编程基础
1.并发编程基础 1.1 基本概念 CPU核心与线程数关系 Java中通过多线程的手段来实现并发,对于单处理器机器上来讲,宏观上的多线程并行执行是通过CPU的调度来实现的,微观上CPU在某个时刻只会运 ...
- 游戏编程系列[1]--游戏编程中RPC协议的使用
RPC(Remote Procedure Call Protocol)--远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些传输协议的存在 ...
- java并发编程系列原理篇--JDK中的通信工具类Semaphore
前言 java多线程之间进行通信时,JDK主要提供了以下几种通信工具类.主要有Semaphore.CountDownLatch.CyclicBarrier.exchanger.Phaser这几个通讯类 ...
- 学习ASP.NET Core Blazor编程系列十——路由(中)
学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...
- 游戏编程系列[2]--游戏编程中RPC与OpLog协议的结合--序
在系列[1]中,我们展示了RPC调用协议的定义以及演示,通过方法定义以及协议约定,进行了协议约定以及调用过程的约定.然而,实际上在游戏中,调用过程之后,需要传输相对多的数据给服务端. 常用场景,客户端 ...
- 游戏编程系列[1]--游戏编程中RPC协议的使用[2]--Aop PostSharp篇
上一篇我们使用了一个通用JSON协议约定来进行达到远程调用的目的.但是从实现上,我们需要不断的在所有的方法上添加拦截,并且判断拦截,然后执行,这就达到了一个比较繁琐的目的. 之前我们尝试过使用代码生成 ...
- python编程系列---Pycharm快捷键(更新中....)
以下是我常用到的Pycharm快捷键(还有很多,只是我暂时用的最多的就这些): 在开发过程中,经常使用一些快捷键会大大提高开发效率,不要因为看这多而不用,常用的就那些,用得多就都记住了,脱离鼠标,逼格 ...
- Hadoop中RPC协议小例子报错java.lang.reflect.UndeclaredThrowableException解决方法
最近在学习传智播客吴超老师的Hadoop视频,里面他在讲解RPC通信原理的过程中给了一个RPC的小例子,但是自己编写的过程中遇到一个小错误,整理如下: log4j:WARN No appenders ...
随机推荐
- 故障重现(内存篇2),JAVA内存不足导致频繁回收和swap引起的性能问题
背景起因: 记起以前的另一次也是关于内存的调优分享下 有个系统平时运行非常稳定运行(没经历过大并发考验),然而在一次活动后,人数并发一上来后,系统开始卡. 我按经验开始调优,在每个关键步骤的加入如 ...
- .NET Core系列 : 1、.NET Core 环境搭建和命令行CLI入门
2016年6月27日.NET Core & ASP.NET Core 1.0在Redhat峰会上正式发布,社区里涌现了很多文章,我也计划写个系列文章,原因是.NET Core的入门门槛相当高, ...
- ABP文档 - 后台作业和工作者
文档目录 本节内容: 简介 后台作业 关于作业持久化 创建一个后台作业 在队列里添加一个新作业 默认的后台作业管理器 后台作业存储 配置 禁用作业执行 Hangfire 集成 后台工作者 创建一个后台 ...
- 80 端口被占用 pid=4
80端口被pid=4的系统进程给占用的解决方法: 一般开发的时候我们都会安装sqlserver ,也会把Sql server Reporting Services 安装上去.原因就是这个服务占用了80 ...
- Android之常见问题集锦Ⅱ
Android问题集锦Ⅰ:http://www.cnblogs.com/AndroidJotting/p/4608025.html EditText输入内容改变事件监听 _edit.addTextCh ...
- CRL快速开发框架系列教程十(导出对象结构)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- Expression Blend创建自定义按钮
在 Expression Blend 中,我们可以在美工板上绘制形状.路径和控件,然后修改其外观和行为,从而直观地设计应用程序.Button按钮也是Expression Blend最常用的控件之一,在 ...
- 在开源中国(oschina)git中新建标签(tags)
我今天提交代码到主干上面,本来想打个标签(tags)的. 因为我以前新建过标签(tags),但是我现在新建的时候不知道入库在哪了.怎么找也找不到了. 从网上找资料也没有,找客服没有人理我,看到一个交流 ...
- 安装并使用PHPunit
安装并使用PHPunit Linux 下安装PHPunit PHP 档案包 (PHAR) 要获取 PHPUnit,最简单的方法是下载 PHPUnit 的 PHP 档案包 (PHAR),它将 PHPU ...
- Zephyr OS 简介
最新发布的开源 Zephyr Project™(Zephyr 项目)是一款小型且可伸缩的实时操作系统,尤其适用于资源受限的系统,可支持多种架构:该系统高度开源,对于开发人员社区完全开放,开发人员可根据 ...