c# 实现RPC框架的思路

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

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

核心代码

 

using System;
using System.Collections;
using System.Collections.Generic;
using System.Threading.Tasks;
using DragonBones;
using UnityEngine;

/// <summary>
/// Test实现RPC框架
/// </summary>
public class TestTask : MonoBehaviour
{
    private readonly Dictionary<string, Action<object>> requestCallback = new Dictionary<string, Action<object>>();
    
    // 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<object> MyTestTask()
    {
        C_SendMsg();//发送方法
        TaskCompletionSource<object> tcs;
        tcs = new TaskCompletionSource<object>();
        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);
    }
}

结果

 

posted @ 2018-12-19 15:10  三页菌  阅读(1721)  评论(0编辑  收藏  举报