今天,有介绍akka的文章,就下了个源码的demo练手!
在TimeServer 这个实例中主要就2个文件
server端
static void Main(string[] args) { using (var system = ActorSystem.Create("TimeServer")) { Console.Title = "Server"; var server = system.ActorOf<TimeServerActor>("time"); Console.ReadLine(); Console.WriteLine("Shutting down..."); Console.WriteLine("Terminated"); } } public class TimeServerActor : TypedActor, IHandle<string> { private readonly ILoggingAdapter _log = Context.GetLogger(); public void Handle(string message) { if (message.ToLowerInvariant() == "gettime") { var time =DateTime.UtcNow.ToLongTimeString(); Sender.Tell(time, Self); } else { _log.Error("Invalid command: {0}", message); var invalid = "Unrecognized command"; Sender.Tell(invalid, Self); } } }
客户端
private static void Main(string[] args) { using (var system = ActorSystem.Create("TimeClient")) { var tmp = system.ActorSelection("akka.tcp://TimeServer@localhost:9391/user/time"); Console.Title = string.Format("TimeClient {0}", Process.GetCurrentProcess().Id); var timeClient = system.ActorOf(Props.Create(() => new TimeClientActor(tmp)), "timeChecker"); var fiber = FiberFactory.CreateFiber(3); while (!Program.IsShutdown) { fiber.Add(() => { Thread.Sleep(3); timeClient.Tell(Time); }); } Console.WriteLine("Connection closed."); fiber.GracefulShutdown(TimeSpan.FromSeconds(1)); Console.ReadLine(); IsShutdown = true; Console.WriteLine("Shutting down..."); Console.WriteLine("Terminated"); } } public class CheckTime { } public class CheckTime2 { } public static CheckTime Time = new CheckTime(); public static CheckTime2 Time2 = new CheckTime2(); public class TimeClientActor : TypedActor, IHandle<string>, IHandle<CheckTime> { private readonly ICanTell _timeServer; public TimeClientActor(ICanTell timeServer) { _timeServer = timeServer; } public void Handle(string message) { Console.WriteLine(message); } public void Handle(CheckTime message) { _timeServer.Tell("gettime", Self); } }
测试的时候,一直不知道 客户端传入CheckTime 类型,服务器是如何处理的。
测试才知道,原来不论你第一次传的是什么类型数据,都会原封不动的返回给客户端。
例如 你第一次直接传入字符串 gettime ,服务器返回的是还是gettime ,而不是日期