Xamarin使XRPC实现接口/委托远程调用

        在之前的文章中已经介绍如何使用Beetlex.XRCP组件进行接口/委托远程调用;由于组件BeetleX.XRPC.Clients支持.NETStandard2,因此Xamarin同样可以使用它来实现基于接口/委托的数据交互通讯。

        接下来通过Xamarin实现一个简单的移动程序,并通过XRPC的功能基于远程接口调用的方式登陆到服务端,然后再通过委托远程调用的方式来相互获取对方的系统和时间信息。

服务端定义

        服务主要定义一个用户接口并实现登陆方法,然后注册一个委托用于返回服务信息和时间给客户端。

class Program
{static void Main(string[] args){var builder = new HostBuilder().ConfigureServices((hostContext, services) =>{//开services.UseXRPC(s =>{s.ServerOptions.LogLevel = BeetleX.EventArgs.LogType.Info;s.ServerOptions.DefaultListen.Port = 9090;s.ServerOptions.DefaultListen.SSL = true;//开启SSLs.ServerOptions.DefaultListen.CertificateFile = "test.pfx";s.ServerOptions.DefaultListen.CertificatePassword = "123456";s.RPCOptions.ParameterFormater = new JsonPacket();//default messagepack},s =>{//绑定一个委托s.AddDelegate<Func<Task<string>>>(() =>{return Task.FromResult($"{Environment.OSVersion} {DateTime.Now}");});}, typeof(Program).Assembly);});builder.Build().Run();}
}
//定义登陆接口
public interface IUser
{Task<string> Login(string name, string pwd);
}[Service(typeof(IUser))]
public class HelloImpl : IUser
{//实现登陆方法public Task<string> Login(string name, string pwd){var context = XRPCServer.EventToken;GetClientTime(context.Server, context.Session);Console.WriteLine($"{name} login at {context.Session.RemoteEndPoint}");return $"{name} login {DateTime.Now}".ToTask();}//定时从登陆客户端获取系统和时间信息并打印private async Task GetClientTime(XRPCServer server, BeetleX.ISession session){//创建对应session的远程委托代理var action = server.Delegate<Func<Task<string>>>(session);while (true){//调用委托var result = await action();Console.WriteLine($"{result}@{session.RemoteEndPoint}");await Task.Delay(1000);}}
}

以上服务使用了TLS作为基础安全通讯。启动服务后会显示以下日志

客户端定义

        Xamarin下使用XRPC只需要引用BeetleX.XRPC.Clients即可,引用完成后可以定义XRPCClient对象来进行通讯。

public partial class MainPage : ContentPage
{public MainPage(){InitializeComponent();//定义XRPC客户端mClient = new BeetleX.XRPC.Clients.XRPCClient("192.168.1.18", 9090, "beetlex");mClient.CertificateValidationCallback = (s, certificate, chain, sslPolicyErrors) => true;mClient.Options.ParameterFormater = new JsonPacket();//创建接口远程接口代理mUser = mClient.Create<IUser>();//定义委托给服务端调用mClient.AddDelegate<Func<Task<string>>>(() =>{return Task.FromResult($"{Environment.OSVersion} {DateTime.Now}");});//创建对应服务端的远程委托代理mGetTime = mClient.Delegate<Func<Task<string>>>();}private Func<Task<string>> mGetTime;private static IUser mUser;private static BeetleX.XRPC.Clients.XRPCClient mClient;private async void Button_Clicked(object sender, EventArgs e){try{if (string.IsNullOrEmpty(userName.Text)){await DisplayAlert("Error", "Enter you name!", "OK");return;}//登陆var result = await mUser.Login(userName.Text, userPwd.Text);this.layoutGrid.IsVisible = false;this.cmdLogin.IsVisible = false;OnGetTime();}catch (Exception e_){await DisplayAlert("Error", e_.Message, "OK");}}private async Task OnGetTime(){try{//定时获取服务和时间信息while (true){var result = await mGetTime();txtResult.Text = result;await Task.Delay(1000);}}catch (Exception e_){await DisplayAlert("Error", e_.Message, "OK");this.layoutGrid.IsVisible = true;this.cmdLogin.IsVisible = true;}}
}

BeetleX

开源跨平台通讯框架(支持TLS)
轻松实现高性能:tcp、http、websocket、redis、rpc和网关等服务应用

https://beetlex.io

如果你想了解某方面的知识或文章可以把想法发送到

henryfan@msn.com|admin@beetlex.io

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/305911.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql 拷贝安装_Mysql的安装和主从复制

安装mysql服务步骤一&#xff1a;首先下载mysql的yum源配置 &#xff0c;下载mysql的yum源wget http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm步骤二&#xff1a;安装mysql的yum源yum -y install mysql57-community-release-el7-11.noarch.rpm步骤三&…

浅谈CLR基础知识

中午的时候&#xff0c;有一个小伙伴问我&#xff0c;CLR到底是进程还是线程&#xff0c;它和自己写的程序是怎么关联的。这一问&#xff0c;直接把我问懞了。下面我尝试用简单的语言来描述这个问题&#xff0c;有的地方无法讲的太细&#xff08;不然内容会太多&#xff09;&am…

mysql打开无法控制_MySQL不能启动和停止 MySQL各种解决方法教程

MySQL不能启动和停止 MySQL各种解决方法教程本文章总结了种MySQL无法启动、无法停止解决办法&#xff0c;包括在windows系统,linux系统中mysql不能启动与停止的解决办法&#xff0c;有需了解的朋友可进入参考。解决无法启动A、先使用命令C:/Program files/mysql/bin/mysqladmin…

NHibernate中的SchemaExport

昨天&#xff0c;在看hibernate文档的时候&#xff0c;看到了这样一段&#xff1a; You should now create this table in your database manually, and later read Chapter 15, Toolset Guide if youwant to automate this step with the SchemaExport tool. This tool can …

Asp.Net Core使用Skywalking实现分布式链路追踪

介绍Skywalking 是 Apache 基金会下面的一个开源 APM 项目&#xff0c;是一套(APM)分布式追踪系统&#xff0c;提供了很多数据存储列如&#xff1a;Mysql&#xff0c;H2&#xff0c;Elasticsearch7 等。其中APM 全称是应用性能监测软件&#xff0c;主要是用来处理以及追踪分布式…

python 里什么时候缩进_python什么时候缩进

Python中的缩进(Indentation)决定了代码的作用域范围。这一点和传统的c/c有很大的不同(传统的c/c使用花括号花括号{}符决定作用域的范围&#xff1b;python使用缩进空格来表示作用域的范围&#xff0c;相同缩进行的代码是处于同一范围)。每行代码中开头的空格数(whitespace)用于…

Hey, everybody!

今天有一位MVP朋友问我是否想做MVP&#xff0c;我想了半天&#xff0c;还是觉得有机会就要尝试&#xff0c;失败了也没什么大不了的。所以最后决定要参加这么一次活动&#xff0c;虽然是自不量力&#xff0c;也要搏一搏啦&#xff01;如果说大家都能够来推荐我一下多好啊&#…

C# 9 新特性 —— 补充篇

C# 9 新特性 —— 补充篇Intro前面我们分别介绍了一些 C# 9 中的新特性&#xff0c;还有一些我觉得需要了解一下的新特性&#xff0c;写一篇作为补充。Top-Level Statements在以往的代码里&#xff0c;一个应用程序必须要有 Main 方法才能运行&#xff0c;从 C# 9 开始&#xf…

使用Popup窗口创建无限级Web页菜单(5)

代码框架在(4)里面已经全部列出来了&#xff0c;现在工作就是按流程把他们完成。本来实现一个prototype的Menu菜单类只需要最多300行代码&#xff0c;可是后来做了一些操作习惯支持和UI显示上的优化后&#xff0c;代码猛增到了1000多行。不过final版本看起来确实比土不拉叽的pr…

【gRPC】ProtoBuf 语言快速学习指南

继上篇【gRPC】 在.Net core中使用gRPC了解了gRPC的使用&#xff0c;gRPC基于HTTP/2和ProtoBuf&#xff0c;ProtoBuf就非常有必要好好了解一下了&#xff0c;那么ProtoBuf究竟是什么&#xff1f;ProtoBuf Google Protocol Buffer是一种语言无关、平台无关、可扩展的序列化结构数…

vspythonqt混合_PYQT5 vscode联合操作qtdesigner的方法

除了使用pycharm外&#xff0c;还可使用vscode来操作pyqt&#xff0c;方法如下&#xff1a;1. 在vscode中配置相关的pyqt的相关根据自己实际情况修改第一项pyqt的路径2. 创建一个文件夹&#xff0c;右键&#xff0c;最后一项可以创建一个新窗口创建的新窗口后缀为 .ui右键中有以…

发现 ASP.Net 的一个关于回车提交的 Bug ? 必须多于一个 Text 域回车提交,Server: ButtonX_Click 才能截获!...

ASP.Net 中: 如果 Text 类型的域只有一个,此时按下回车提交,WebServer 端 ButtonX_Click 竟然截获不到,只能在 WebServer 端 Page_Load 里截获,与传统的 Web Form 提交到 Action CGI 没区别了!假如 Text 类型的域多于一个,此时按下回车提交,在 WebServer 端 ButtonX_Click 可以…

TIOBE 1 月榜单:Python年度语言四连冠,C 语言再次第一

喜欢就关注我们吧&#xff01;TIOBE 公布了 2021 年 1 月的编程语言排行榜。TIOBE 本月公布了 2020 年度编程语言&#xff0c;Python 获得四连冠&#xff0c;是过去一年中最受欢迎的编程语言。Python 在 2020 年实现了 2.01&#xff05; 的正增长&#xff1b;C 紧随其后&#x…

java 验证登陆_java登陆界面验证

展开全部以下代码就是了。详细参照附件import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swin…

A piecture of J2EE Core Patterns

这张图是J2EE Core Patterns里面的一幅图片,在Enterprise Solution Patterns Using Microsoft.Net里面虽然模式的概念与应用大同小异&#xff0c;但是那张表现架构模式整体的图感觉有点不直观,相比之下这幅图显得更清晰一点。 发到这里供大家参考学习&#xff1a;&#xff09…

孙丕恕离开浪潮 仪器厂历时60年成为服务器龙头企业

2020年12月31日浪潮集团有限公司董事会选举邹庆忠为公司董事长&#xff08;法定代表人&#xff09;&#xff1b;孙丕恕不再担任公司董事长&#xff1b;公司不再聘任孙丕恕为首席执行官。另外&#xff0c;经省委研究决定&#xff0c;拟任省直部门&#xff08;单位&#xff09;副…

java 数组 树_java使用顺序数组实现二叉树

顺序数组实现二叉树实现原理对于下标为index的节点其满足1.左孩子节点的下标为2index12.右孩子节点的下标为2index2代码实现package tree;public class ArrayBinaryTree {private int[] arr;public ArrayBinaryTree(int[] arr){this.arrarr;}public void preOrder(int index){i…

hack 入侵 142 主机的过程

时间 2005 3 29 iis 日志文件显示有黑客痕迹 常用的iis 分析软件的介绍 使用 find 命令 入侵检测的常用方法参考 http://www.xfocus.net/articles/200208/440.html 编写日志脚本参考 http://www.blueidea.com/bbs/archivecontent.asp?id1304500 sql 注入方法介绍和预防 http:/…

【Docker】Asp.net core在docker容器中的端口问题

还记得【One by one系列】一步步学习docker&#xff08;三&#xff09;——实战部署dotnetcore中遇到的问题么&#xff1f;容器内部启动始终是80端口&#xff0c;并不由命令左右。docker run --name container-name -p 81:5000 mywebapi所谓知其然就要知其所以然&#xff0c;浅…

新华字典java_新华字典查询示例代码

package api.binstd.zidian;import java.net.URLEncoder;import api.util.HttpUtil;import net.sf.json.JSONArray;import net.sf.json.JSONObject;public class Word {public static final String APPKEY "your_appkey_here";// 你的appkeypublic static final Str…