游戏编程系列[1]--游戏编程中RPC协议的使用[3]--体验
2024-08-25 01:27:28
运行环境,客户端一般编译为.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结果会有点区别。
附:演示代码下载点我
最新文章
- [LintCode] Longest Common Prefix 最长共同前缀
- LDAP与jenkins
- 电脑控制台灯(c# hook,显示室温,联网校正时间)
- Frament 方法
- scandir 使用示例
- 使用 .gitignore来忽略某些文件【转】
- LoadRunner--内存指标介绍
- [转]linux 下使用dump和restore命令
- 【Apache运维基础(1)】Apache的安装与使用
- Xcode文档下载与安装路径
- Jdk5.0中出现的新特性
- Modelsim的自动化脚本仿真平台
- Javascript绝句欣赏
- sicp第1章
- ios 面试题 经典(比较全) 根据重点总结
- 手机访问pc网站,自动跳转到手机网站
- Linux下随机生成密码的命令总结
- 如何将R包安装到自定义路径
- JAVA 处理 Spring data mongodb 时区问题
- ●BZOJ 2669 [cqoi2012]局部极小值
热门文章
- 独立开发 一个社交 APP 的架构分享 (已实现)
- AFNetworking 3.0 源码解读(七)之 AFAutoPurgingImageCache
- 2013 Asia Changsha Regional Contest---Josephina and RPG(DP)
- SharePoint 2016 必备组件离线安装介绍
- 利用PowerShell复制SQLServer账户的所有权限
- 打开程序总是会提示“Enter password to unlock your login keyring” ,如何成功关掉?
- Linux系统中的Device Mapper学习
- MyBatis3.2从入门到精通第一章
- 山寨Unity3D?搜狐畅游的免费开源游戏引擎Genesis-3D
- 一步步开发自己的博客 .NET版(5、Lucenne.Net 和 必应站内搜索)