在之前的文章中已经介绍如何使用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