博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Xamarin使XRPC实现接口/委托远程调用
阅读量:4034 次
发布时间:2019-05-24

本文共 3940 字,大约阅读时间需要 13 分钟。

        在之前的文章中已经介绍如何使用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;//开启SSL                    s.ServerOptions.DefaultListen.CertificateFile = "test.pfx";                    s.ServerOptions.DefaultListen.CertificatePassword = "123456";                    s.RPCOptions.ParameterFormater = new JsonPacket();//default messagepack                },                s =>                {                    //绑定一个委托                    s.AddDelegate
>>(() => { return Task.FromResult($"{Environment.OSVersion} {DateTime.Now}"); }); } , typeof(Program).Assembly); }); builder.Build().Run(); }}//定义登陆接口public interface IUser{ Task
Login(string name, string pwd);}[Service(typeof(IUser))]public class HelloImpl : IUser{ //实现登陆方法 public Task
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
>>(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
(); //定义委托给服务端调用 mClient.AddDelegate
>>(() => { return Task.FromResult($"{Environment.OSVersion} {DateTime.Now}"); }); //创建对应服务端的远程委托代理 mGetTime = mClient.Delegate
>>(); } private Func
> 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://ufudi.baihongyu.com/

你可能感兴趣的文章
mysql:sql alter database修改数据库字符集
查看>>
mysql:sql drop table (删除表)
查看>>
mysql:sql truncate (清除表数据)
查看>>
scrapy:xpath string(.)非常注意问题
查看>>
yuv to rgb 转换失败呀。天呀。谁来帮帮我呀。
查看>>
yuv420 format
查看>>
YUV420只绘制Y通道
查看>>
yuv420 还原为RGB图像
查看>>
LED恒流驱动芯片
查看>>
驱动TFT要SDRAM做为显示缓存
查看>>
使用file查看可执行文件的平台性,x86 or arm ?
查看>>
qt5 everywhere 编译summary
查看>>
qt5 everywhere编译完成后,找不到qmake
查看>>
arm-linux开机读取硬件时钟,设置系统时钟。
查看>>
交叉编译在x86上调试好的qt程序
查看>>
/dev/input/event0 键盘输入
查看>>
qt 创建异形窗体
查看>>
可重入函数与不可重入函数
查看>>
简单Linux C线程池
查看>>
内存池
查看>>