BeetleX.XRPC是基于接口的远程通讯组件,它不仅可以把接口提供客户端调用,同样也支持服务端创建客户端的接口实例并主动调用客户端的方法.接口有着非常的规范性和约束性,但前提你是必须制定相应的接口并实现才行;为了让通讯在.NET平台使用变得更简便,在新版中组件支持远程委托调用.这功能不仅可以让客户端调用服务端的委托,同样也可以让服务端调用客户端的委托.

简介

组件支持任何委托的定义和调用包括框架集成的Action<T...>,Fun<T...,Result>和自定义委托.为了更好地满足通讯上的需求还是有一些简单的规则约束;主要限制有:参数暂不支持refout,参数类型不能为Object因为无法进行反序列化处理.返回值必须是Task,Task<T>Void;为了在IO处理上更好地配合async/await来提高性能,组件要求返回值必须是TaskTask<T>,之所以支持Void主要是用于一些特别的场景,当委托为Void时是不会理会对端处理的情况(即发送后不管模式).还有组件对委托的参数也有限制,最大不能超过10个参数.

注册委托

组件提供了一致的方式来进行委托注册,方法如下:

AddDelegate<T>(T handler) where T : Delegate

注册方法是可以任意委托类型和对应的方法

//客户端
mClient = new XRPCClient("localhost", 9090);
mClient.Options.ParameterFormater = new JsonPacket();
mClient.AddDelegate<Action<DateTime>>(SetTime);
//服务端
mServer.AddDelegate<ListEmployees>(() => Task.FromResult(DataHelper.Defalut.Employees));
mServer.AddDelegate<ListCustomers>(() => Task.FromResult(DataHelper.Defalut.Customers));

在绑定委托可以指定类函数也可以是匿名函数;当注册委托后对端就可以使用相同类型的Delegate进行代理和调用.

创建委托并调用

组件同样提供一致的方式来创建代理和调用

//客户端
mClient.Delegate<ListEmployees>()();
//服务端
mServer.Delegate<Action<DateTime>>(session)(DateTime.Now);

组件通过Delegate方法来创建相应委托代理,不过服务端在创建的时候必须指定客户端的session对象,创建建委托后就可以直接调用.

完整示例

接下来做一个完全的数据查询示例来展示一下基于远程委托调用的便利性,为了满足这个示例的要求自定义了以下三个委托:

    public delegate Task<List<Order>> ListOrders(int employee, string employeeid);public delegate Task<List<Employee>> ListEmployees();public delegate Task<List<Customer>> ListCustomers();

这三个委托分别是:雇员,客户和订单查询.接下来就定义一个WPF的客户端程序通过调用这三个委托来进行数据查询的操作:

public partial class MainWindow : Window
{public MainWindow(){InitializeComponent();}XRPCClient mClient;private async void Window_Loaded(object sender, RoutedEventArgs e){mClient = new XRPCClient("localhost", 9090);mClient.Options.ParameterFormater = new JsonPacket();mClient.AddDelegate<Action<DateTime>>(SetTime);comboEmployees.ItemsSource = from a in await mClient.Delegate<ListEmployees>()() select new { a.EmployeeID, Name = $"{a.FirstName} {a.LastName}" };comboxCustomer.ItemsSource = await mClient.Delegate<ListCustomers>()();lstOrders.ItemsSource = await mClient.Delegate<ListOrders>()(0, null);}private void SetTime(DateTime time){this.Dispatcher.BeginInvoke(new Action<DateTime>(t =>{this.txtTime.Content = t.ToString();}), time);}private async void CmdSearch_Click(object sender, RoutedEventArgs e){lstOrders.ItemsSource = await mClient.Delegate<ListOrders>()(comboEmployees.SelectedValue != null ? (int)comboEmployees.SelectedValue : 0,comboxCustomer.SelectedValue != null ? (string)comboxCustomer.SelectedValue : null);}
}

为了展示服务端远程调客户端的,这里注册了一个Action<DateTime>用于服务端主动设置客户端时间的方法.

static void Main(string[] args)
{var builder = new HostBuilder().ConfigureServices((hostContext, services) =>{services.UseXRPC(s =>{s.ServerOptions.LogLevel = LogType.Warring;s.RPCOptions.ParameterFormater = new JsonPacket();},c => {c.AddDelegate<ListEmployees>(() => Task.FromResult(DataHelper.Defalut.Employees));c.AddDelegate<ListCustomers>(() => Task.FromResult(DataHelper.Defalut.Customers));c.AddDelegate<ListOrders>((emp, cust) =>{Func<Order, bool> filter = (o) => (emp == 0 || o.EmployeeID == emp) && (String.IsNullOrEmpty(cust) || o.CustomerID == cust);return Task.FromResult((from a in DataHelper.Defalut.Orders where filter(a) select a).ToList());});Task.Run(() =>{while (true){foreach (var item in c.Server.GetOnlines()){c.Delegate<Action<DateTime>>(item)(DateTime.Now);System.Threading.Thread.Sleep(1000);}}});},typeof(Program).Assembly);});builder.Build().Run();
}

以上是服务端的代码,注册了对应数据查询的委托,并开启一个简单的定时任务每秒中向所有客户端发送当前时间信息.接下来可以启动服务端和客户端运行结果如下:

从以上示例中可以发现,如果简单的数据传输处理,那用委托进行一个约束使用起的确是简便一些,毕竟.Net内置了一些委托类型可供使用无须自己定义,不过从应用规范上来说定义具体名称的委托或用接口来制定调用规范还是很有必要的. 如果你想获取完全示例可以访问: https://github.com/IKende/BeetleX-Samples/tree/master/XRPC.DelegateInvoke

BeetleX之XRPC远程委托调用相关推荐

  1. XRPC接口双向调用

    一般远程接口调用的服务都是基于客户端主动调用服务端,由服务端来提供相关的接口服务:在新版本的XRPC中引入了一个新的功能,即接口双向通讯,组件提供服务创建客户会话的接口代理并调用客户提供的接口服务.接 ...

  2. 远程过程调用RPC简介

    RPC(Remote Procedure Call, 远程过程调用):是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的思想. RPC是一种技术思想而非一种规范或协议,常见RPC技术 ...

  3. XML-RPC远程方法调用

    一.简介 XML-RPC的全称是XML Remote Procedure Call,即XML远程方法调用. 它是一套允许运行在不同操作系统.不同环境的程序实现基于Internet过程调用的规范和一系列 ...

  4. RPC(Remote Procedure Calls)远程过程调用

    很长时间以来都没有怎么好好搞清楚RPC(即Remote Procedure Call,远程过程调用)和HTTP调用的区别,不都是写一个服务然后在客户端调用么?这里请允许我迷之一笑~Naive!本文简单 ...

  5. 委托声明----委托实例化-----委托调用

    定义和使用委托分三个步骤: 1.委托声明.2.委托实例化.3.委托调用. 一.定义委托 定义委托的语法如下: <访问修饰符> delegate 返回类型 委托名(); 定义委托和定义方法很 ...

  6. c#委托调用另一窗口函数_在C#中使用委托调用成员函数

    c#委托调用另一窗口函数 Prerequisite: Delegates in C# 先决条件: C#中的代表 We can also call a member function of a clas ...

  7. Hessian Binary Web Service Protocol远程接口调用入门

    摘要:Hessian是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能. 相比WebService,Hessian更简单.快捷.采用的是二进制RPC协议,因为采用的是二 ...

  8. 远程过程调用RPC RMI(Remote Method Invocation)和Web Service

    2019独角兽企业重金招聘Python工程师标准>>> 一.RPC是什么 RPC的全称是Remote Procedure call,是进程间通信方式. 他允许程序调用另一个地址空间的 ...

  9. java中使用rmi进行远程方法调用

    java中进行远程方法调用,能支持分布式计算.并且可以实现在server的修改,能反应到各个client. 假如server的ip是:192.168.11.2, server端的代码如下: /*** ...

最新文章

  1. java计算数组均值
  2. excel loc() python_总结:像Excel一样使用python进行数据分析
  3. mybatis oracle 大写,解决mybatis用Map返回的字段全变大写的问题
  4. Flash--元件和实例
  5. 4万家公司没了!这个吸血房客的行业,终于要崩了?
  6. Python 面向对象(OOP)基本概念
  7. 3D视觉(一)三维数学基础教程和SLAM
  8. 论文审稿回复LaTeX模板
  9. 来自大数据的反思:需要你读懂的10个小故事
  10. java 重载的特征_Java中方法的重载详解
  11. 什么是管理者的有用功
  12. 单片机遥控开关mos管
  13. jquery中判断元素是否含有某个类名
  14. [记录] android源码下载编译
  15. 【软件测试教程】手机号码归属地开发文档
  16. 计算机对学生的影响英语作文,电脑游戏对孩子学习及生活的影响英语作文
  17. ROS下dobot(magician)机械臂的python demo
  18. JAVA设计模式什么鬼(装饰)——作者:凸凹里歐
  19. 到处都是Unix的胎记
  20. 每瓶海天酱油都有“大数据”

热门文章

  1. struts2 标签不能使用EL 表单式
  2. 弹窗php整人_[整人小程序] 超级信息框(无限弹窗++)
  3. 从Windows计算机上完全删除iTunes和其他Apple软件
  4. PropertySource和ConfigurationProperties
  5. 快来加入阿里云大学【云学院】班级助理招募—机会稍纵即逝,错过遥遥无期!...
  6. 每个程序员都可能犯过的10个错误
  7. Maven私服的简单搭建教程(Nexus)
  8. linux笔记 3-4 SMTP,.配置电子邮件传输
  9. 【转】java io 总结(图)
  10. google code for xbmc addons2