akka 练手 原来第一次是原封不动的返回传出去的参数

今天,有介绍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 ,而不是日期

 

posted @ 2015-11-10 18:03  过错  阅读(439)  评论(0编辑  收藏  举报