日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

XRPC接口双向调用

發(fā)布時間:2023/12/4 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 XRPC接口双向调用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一般遠(yuǎn)程接口調(diào)用的服務(wù)都是基于客戶端主動調(diào)用服務(wù)端,由服務(wù)端來提供相關(guān)的接口服務(wù);在新版本的XRPC中引入了一個新的功能,即接口雙向通訊,組件提供服務(wù)創(chuàng)建客戶會話的接口代理并調(diào)用客戶提供的接口服務(wù)。接下來介紹如何通過XRPC來使用接口雙向通訊的應(yīng)用,并實現(xiàn)服務(wù)端調(diào)用WFP/WINFROM這些客戶端的本地方法。

引用組件

組件提供兩個包分別是:BeetleX.XRPC和BeetleX.XRPC.Clients;前者是在.net core上使用,而后者則提供給WFP/WINFROM使用.在0.8.2.3版本開始支持接口雙向調(diào)用功能。

使用

組件是以接口作為基礎(chǔ)通訊單元,所以必須以接口的方式來描述服務(wù)調(diào)用邏輯。接下來實現(xiàn)一個簡單的接口,客戶端向服務(wù)調(diào)用注冊方法,服務(wù)端在接受客戶注冊后創(chuàng)建一個會話代理并調(diào)用獲取客戶端的時間。接口定義如下:

public interface IUser{Task Login(string name);Task<DateTime> GetTime();}

接口比較簡單分別是Login和GetTime,接下來會分別在服務(wù)端和客戶端實現(xiàn)這一接口,并進(jìn)行一個雙向調(diào)用。

服務(wù)端實現(xiàn)

[Service(typeof(IUser))]public class Program : IUser{static void Main(string[] args){var builder = new HostBuilder().ConfigureServices((hostContext, services) =>{services.UseXRPC(s =>{s.ServerOptions.LogLevel = BeetleX.EventArgs.LogType.Warring;s.ServerOptions.DefaultListen.Port = 9090;s.RPCOptions.ParameterFormater = new JsonPacket();//default messagepack},typeof(Program).Assembly);});builder.Build().Run();}public Task<DateTime> GetTime(){return DateTime.Now.ToTask();}public Task Login(string name){Console.WriteLine($"{name} login");var token = XRPCServer.EventToken;Task.Run(async () =>{IUser user = token.Server.GetClient<IUser>(token.Session);while (true){var time = await user.GetTime();Console.WriteLine($"{name}[{token.Session.RemoteEndPoint}] time is:{time}");//await Task.Delay(1000);}});return Task.CompletedTask;}}

代碼比較簡單,在登陸方法中創(chuàng)建一個異步方法,并在方法中創(chuàng)建一個IUser針對當(dāng)前會話的一個代理,然后循環(huán)調(diào)用客戶端方法獲取相應(yīng)的時間。

客戶端實現(xiàn)

class Program : IUser{static XRPCClient client;static void Main(string[] args){client = new XRPCClient("192.168.2.18", 9090);client.PingTimeout = 5;client.Options.ParameterFormater = new JsonPacket();client.Register<IUser>(new Program());var user = client.Create<IUser>();user.Login("henry");System.Threading.Thread.Sleep(-1);}public Task<DateTime> GetTime(){return Task.FromResult(DateTime.Now);}public Task Login(string name){return Task.CompletedTask;}}

比起服務(wù)端,客戶端所需要的代碼就更簡單了;通過XRPCClient.Create注冊相關(guān)接口的本地實現(xiàn)類。客戶端調(diào)用user.Login("henry");后服務(wù)端就是不停地向客戶獲取時間。通過運(yùn)行程序可以看到以下運(yùn)行結(jié)果:

以上完整代碼可以從以下連接獲取:?https://github.com/IKende/BeetleX-Samples/tree/master/XRPC.InterfaceTwoWay

聊天服務(wù)

上面已經(jīng)描述了接口雙向調(diào)用的便利性,接下來通過接口雙向調(diào)用快速地實現(xiàn)一個聊天服務(wù)。

public interface IUser{Task Login(string name);Task Talk(string name, string message);Task Exit(string name);}

以上是一個用戶聊天的行為接口,分別是登陸、退出和發(fā)送消息。接下來通過服務(wù)端和客戶端實現(xiàn)這一接口即可完成一個簡單的聊天服務(wù)。

服務(wù)端實現(xiàn)

[EventNext.Service(typeof(IUser))]public class UserImpl : IUser{public Task Exit(string name){return Task.CompletedTask;}public Task Login(string name){var token = XRPCServer.EventToken;token.Session.Name = name;foreach (var session in token.Server.Server.GetOnlines()){if (!string.IsNullOrEmpty(session.Name)){IUser user = token.Server.GetClient<IUser>(session);user.Login(name);}}return Task.CompletedTask;}public Task Talk(string name, string message){var token = XRPCServer.EventToken;if (string.IsNullOrEmpty(token.Session.Name)){throw new Exception("登陸無效!");}foreach (var session in token.Server.Server.GetOnlines()){if (!string.IsNullOrEmpty(session.Name)){IUser user = token.Server.GetClient<IUser>(session);user.Talk(session.Name, message);}}return Task.CompletedTask;}}

服務(wù)端主要實現(xiàn)了兩個方法,分別是登陸和發(fā)送消息;兩個方法的都基本一樣,在方法調(diào)用里面獲取所有會話的IUser代理,并執(zhí)行相關(guān)方法即可。為什么Exit這個方法沒有實現(xiàn)呢,主要是服務(wù)通過監(jiān)聽連接斷開事件進(jìn)行處理,代碼如下:

static void Main(string[] args){var builder = new HostBuilder().ConfigureServices((hostContext, services) =>{services.UseXRPC(s =>{s.ServerOptions.LogLevel = BeetleX.EventArgs.LogType.Debug;s.ServerOptions.DefaultListen.Port = 9090;s.RPCOptions.ParameterFormater = new JsonPacket();//default messagepacks.RPCDisconnect += (o, e) =>{foreach (var session in e.Server.GetOnlines()){if (session != e.Session && !string.IsNullOrEmpty(session.Name)){IUser user = s.GetClient<IUser>(session);user.Exit(e.Session.Name);}}};},typeof(Program).Assembly);});builder.Build().Run();}

這樣一個簡單的聊天服務(wù)就完成,接下來看一下客戶端同樣實現(xiàn)這一接口來完成功能。

客戶端實現(xiàn)

/// <summary>/// MainWindow.xaml 的交互邏輯/// </summary>public partial class MainWindow : Window, IUser{public MainWindow(){InitializeComponent();}public Task Login(string name){AddMessage(name, "login");return Task.CompletedTask;}public Task Exit(string name){AddMessage(name, "exit");return Task.CompletedTask;}public Task Talk(string name, string message){AddMessage(name, message);return Task.CompletedTask;}private BeetleX.XRPC.Clients.XRPCClient mClient;private IUser mUser;private void Window_Loaded(object sender, RoutedEventArgs e){mClient = new BeetleX.XRPC.Clients.XRPCClient("192.168.2.18", 9090);mClient.Options.ParameterFormater = new JsonPacket();mClient.Register<IUser>(this);mUser = mClient.Create<IUser>();txtMessages.Document.Blocks.Clear();}private async void CmdLogin_Click(object sender, RoutedEventArgs e){try{if (string.IsNullOrEmpty(txtName.Text)){MessageBox.Show("請輸入登錄名稱!");return;}await mUser.Login(txtName.Text);MessageBox.Show("登陸成功!");}catch (Exception e_){MessageBox.Show(e_.Message);}}private async void CmdTalk_Click(object sender, RoutedEventArgs e){try{await mUser.Talk(null, txtTalk.Text);}catch (Exception e_){MessageBox.Show(e_.Message);}}}

以上是一個WPF窗體的實現(xiàn),代碼功能是不是很簡單,通過遠(yuǎn)程方法調(diào)用,服務(wù)端可以直接調(diào)用客戶端窗體的方法代碼。接下來看一下實際運(yùn)行效果:

這樣一個簡單了聊天服務(wù)就完成了,看上去是不是非常簡單;如果需要下載示例的完整代碼可以訪問: https://github.com/IKende/BeetleX-Samples/tree/master/XRPC.WFPChat

通過接口雙向調(diào)用的功能,你可以實現(xiàn)更簡單的通訊應(yīng)用開發(fā),因為你再也不需要定義消息標(biāo)記來區(qū)分處理行為,可以大大地提高開發(fā)效率。

總結(jié)

以上是生活随笔為你收集整理的XRPC接口双向调用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。