• 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);
        }
    }

    结果

  • 相关阅读:
    [Canvas]RPG游戏雏形 (地图加载,英雄出现并移动)
    [Canvas]计时表/秒表
    [Canvas]新版箴言钟表
    [Canvas]用透明PNG图在背景上画前景能不遮挡背景
    [Canvas]动态背景
    [Canvas]更多的球
    [Canvas]碰撞球 增加小球间碰撞检测
    [Canvas]碰撞球
    [Canvas]越来越近的女孩
    [Canvas]走近的女孩
  • 原文地址:https://www.cnblogs.com/sanyejun/p/10143413.html
Copyright © 2020-2023  润新知