柚子快报邀请码778899分享:c# 实现RPC框架的思路

http://yzkb.51969.com/

RPC框架,就是远程调用一个方法就像是本地调用一样。

用于网络消息的话,那么你的收发消息通过异步方法可以写在一起,很方便

核心代码

 

using System;

using System.Collections;

using System.Collections.Generic;

using System.Threading.Tasks;

using DragonBones;

using UnityEngine;

///

/// Test实现RPC框架

///

public class TestTask : MonoBehaviour

{

private readonly Dictionary> requestCallback = new Dictionary>();

// Start is called before the first frame update

void Start()

{

TestAsync();

}

//异步方法

async void TestAsync()

{

object data = await MyTestTask();//await回调返回的方法

Debug.Log("执行完毕,收到的数据为" + data);

}

//这个地方我用了object,会有装箱操作,当然ET填的的是一个接口interface,你也可以选择填一个接口

//返回的数据包必须是一个类结构,继承这个接口,然后在里面进行一次隐式转换,就能拿到原有类的对象了

//如果传回来的类不是个接口,比如字典嵌套类(当然很少有人这样做),需要针对字典,List这种 做个优化也是可以

//object虽然万能,但是有个装箱操作,或者用其他方法优化他

//以前写的一个优化object的方法:https://www.cnblogs.com/sanyejun/p/9564320.html

Task MyTestTask()

{

C_SendMsg();//发送方法

TaskCompletionSource tcs;

tcs = new TaskCompletionSource();

Debug.Log("消息发送完毕");

//给对应的加入回调

requestCallback["C_response"] = (data) =>

{

print("异步结束");

tcs.SetResult(data);//给返回值赋值,这里面的data类型取决于前面 Task<类型>

};

return tcs.Task;

}

/*******************模拟客户端******************/

void C_SendMsg()

{

print("客户端发送消息");

S_ServerMethod();

}

//RPC

void C_response(object data)

{

Debug.Log("收到了来自服务器的消息");

requestCallback["C_response"](data);

}

/****************模拟服务器***************/

void S_ServerMethod()

{

print("服务端接收到了消息");

//模拟网络发送慢的等待时间3秒

Invoke("S_SendMSG", 3);

}

void S_SendMSG()

{

C_response(998);

}

}

结果

 

柚子快报邀请码778899分享:c# 实现RPC框架的思路

http://yzkb.51969.com/

参考文章

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。

发表评论

返回顶部暗黑模式