• 通过C#学Proto.Actor模型》之Remote


    Proto.Actor中提供了基于tcp/ip的通迅来实现Remote,可以通过其Remot实现对Actor的调用。

    先来看一个极简单片的远程调用。

    码友看码:

    引用NuGet包

    Proto.Actor

    Proto.Remote

    Proto.Serialization.Wire

     

    共享库:

     1 namespace P009_Lib
     2 {
     3     public class HelloRequest
     4     {
     5         public string Message
     6         {
     7             get; set;
     8         }
     9     } 
    10     public class HelloResponse
    11     {
    12         public string Message
    13         { get; set; }
    14     }
    15 }

    服务端:

     1 using P009_Lib;
     2 using Proto;
     3 using Proto.Remote;
     4 using Proto.Serialization.Wire;
     5 using System;
     6  
     7 using System.Threading;
     8 using System.Threading.Tasks;
     9  
    10 namespace P009_Server
    11 {
    12     class Program
    13     {
    14         static void Main(string[] args)
    15         {
    16             Console.Title = "服务端";
    17             Console.WriteLine("回车开始");
    18             Console.ReadLine();
    19             //设置序列化类型并注册
    20             var wire = new WireSerializer(new[] { typeof(HelloRequest), typeof(HelloResponse) });
    21             Serialization.RegisterSerializer(wire, true);
    22  
    23             var props = Actor.FromProducer(() => new HelloQuestActor());
    24             //注册一个为hello类别的          
    25             Remote.RegisterKnownKind("hello", props);
    26             //服务端监控端口5001
    27             Remote.Start("127.0.0.1", 5001);
    28             Console.WriteLine("服务端开始……");
    29             Console.ReadLine();
    30         }
    31     }
    32  
    33     class HelloQuestActor : IActor
    34     {
    35         public Task ReceiveAsync(IContext context)
    36         {
    37             switch (context.Message)
    38             {
    39                 case HelloRequest msg:
    40                     Console.WriteLine(msg.Message);
    41                     context.Respond(new HelloResponse
    42                     {
    43                         Message = $"回应:我是服务端【{DateTime.Now}】",
    44                     });
    45                     break;
    46             }
    47             return Actor.Done;
    48         }
    49     } 
    50 }

    客户端:

     1 using P009_Lib;
     2 using Proto;
     3 using Proto.Remote;
     4 using Proto.Serialization.Wire;
     5 using System;
     6 using System.Threading.Tasks;
     7  
     8 namespace P009_Client
     9 {
    10     class Program
    11     {
    12         static void Main(string[] args)
    13         {
    14  
    15             Console.Title = "客户端";
    16             Console.WriteLine("回车开始");
    17             Console.ReadLine();
    18             //设置序列化类型并注册
    19             var wire = new WireSerializer(new[] { typeof(HelloRequest), typeof(HelloResponse) });
    20             Serialization.RegisterSerializer(wire, true);
    21             //设置自己监控端口5002
    22             Remote.Start("127.0.0.1", 5002);
    23             //连接服务端5001
    24             var pid = Remote.SpawnNamedAsync("127.0.0.1:5001", "clientActor", "hello", TimeSpan.FromSeconds(50)).Result.Pid;
    25             while (true)
    26             {
    27                 var res = pid.RequestAsync<HelloResponse>(new HelloRequest { Message = $"请求:我是客户端 【{DateTime.Now}】" }).Result;
    28                 Console.WriteLine(res.Message);
    29                 Console.ReadLine();
    30             }
    31         }
    32     }
    33 }

    代码很简单,看注释就够了。

     

    ……

  • 相关阅读:
    android实现 服务器功能
    jQuery部分源码帮助理解
    jquery 2.0.3代码结构
    Mac下配置JAVA_HOME
    用户环境变量
    你的apk有多不安全
    JadClipse eclipse反编译插件
    vim 使用笔记
    Makefile简易模板
    Linux watch 监控系统状态
  • 原文地址:https://www.cnblogs.com/axzxs2001/p/9570640.html
Copyright © 2020-2023  润新知