Информация об изменениях

Сообщение Re: .Net Core, AppDomain, RPC свой велосипед от 20.02.2017 13:19

Изменено 21.02.2017 7:11 Serginio1

Re: .Net Core, AppDomain, RPC свой велосипед
Здравствуйте, Serginio1, Вы писали:

Вобщем сделал на Tcp/IP

Но скорость вызова порядка 1500 вызовов в секунду. Даже не знаю это много или мало?


Вот клиент
  public class AutoWrapClient : DynamicObject
    {
       public int Target;
        IPEndPoint IpEndpoint;

        public AutoWrapClient(int Target,IPEndPoint IpEndpoint)
        {
            //  IPEndPoint ipEndpoint = new IPEndPoint(IPAddress.Parse(АдресСервера), порт);
            this.Target = Target;
            this.IpEndpoint = IpEndpoint;


        }
        // вызов метода

        static public string LastError;

       public static dynamic GetProxy(string ServerAddres, int port)
        {

              IPEndPoint ipEndpoint = new IPEndPoint(IPAddress.Parse(ServerAddres), port);
            return new AutoWrapClient(0, ipEndpoint);

        }
        private BinaryReader SendMessage(MemoryStream stream)
        {

            using (var client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
            { client.Connect(IpEndpoint);
                using (var ns = new NetworkStream(client))
                {
                    stream.Position = 0;
                    ns.Write(BitConverter.GetBytes((Int32)stream.Length), 0, 4);
                    stream.CopyTo(ns);

                    using (var br = new BinaryReader(ns))
                    {
                        var streamSize = br.ReadInt32();

                        var res = br.ReadBytes(streamSize);

                        var ms = new MemoryStream(res);
                        ms.Position = 0;
                        return new BinaryReader(ms);
                    }

            }
            }
        }

        public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
        {
            result = null;

            var ms = new MemoryStream();
            var bw = new BinaryWriter(ms);

            bw.Write((byte)CallMethod.CallFunc);
            bw.Write(Target);
            bw.Write(binder.Name);
            bw.Write(args.Length);

            foreach (var arg in args)
                WorkVariants.WriteObject(arg, bw);

            bw.Flush();

          var res= SendMessage(ms);

            var resRun = res.ReadBoolean();
            var returnValue = WorkVariants.GetObject(res, IpEndpoint);
            if (!resRun)
            {
                if (returnValue != null && returnValue.GetType() == typeof(string))
                    LastError = (string)returnValue;


                return false;
            }

            result = returnValue;
            //  Error=AutoWrap.СообщитьОбОшибке("не найден дженерик тип "+ИмяМетода);
            return true;


        }
    }



И вызов

 Console.OutputEncoding = System.Text.Encoding.UTF8;

        //Process.Start
        Console.WriteLine("Hello Client!");

        var wrap = Client.AutoWrapClient.GetProxy("127.0.0.1", 6891);

        int res = wrap.ReturnParam(3);
        Console.WriteLine(res);

        string str = wrap.ReturnParam("Hello"); // Возвращает параметр 
        Console.WriteLine(str);
        Console.WriteLine(wrap.ReturnParam(3.14));
        Console.WriteLine(wrap.ReturnParam(DateTime.Now));

        decimal dc = 678.89M;
        Console.WriteLine(dc);
        var stopWatch = new System.Diagnostics.Stopwatch();
        int count = 0;
        stopWatch.Start();
        for (int i = 0; i < 10000; i++)
        {
            count += wrap.ReturnParam(i);

        }

        stopWatch.Stop();
        var ts = stopWatch.Elapsed;
        var elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds,
   ts.Milliseconds / 10, 0);

        Console.WriteLine(count);
        Console.WriteLine(elapsedTime);
        Console.ReadLine();
Re: .Net Core, AppDomain, RPC свой велосипед
Здравствуйте, Serginio1, Вы писали:

Вобщем сделал на Tcp/IP

Но скорость вызова чуть больше 2000 вызовов в секунду. Даже не знаю это много или мало?


Вот клиент
  public class AutoWrapClient : DynamicObject
    {
       public int Target;
        IPEndPoint IpEndpoint;

        public AutoWrapClient(int Target,IPEndPoint IpEndpoint)
        {
            //  IPEndPoint ipEndpoint = new IPEndPoint(IPAddress.Parse(АдресСервера), порт);
            this.Target = Target;
            this.IpEndpoint = IpEndpoint;


        }
        // вызов метода

        static public string LastError;

       public static dynamic GetProxy(string ServerAddres, int port)
        {

              IPEndPoint ipEndpoint = new IPEndPoint(IPAddress.Parse(ServerAddres), port);
            return new AutoWrapClient(0, ipEndpoint);

        }
        private BinaryReader SendMessage(MemoryStream stream)
        {

            using (var client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
            { client.Connect(IpEndpoint);
                using (var ns = new NetworkStream(client))
                {
                    stream.Position = 0;
                    ns.Write(BitConverter.GetBytes((Int32)stream.Length), 0, 4);
                    stream.CopyTo(ns);

                    using (var br = new BinaryReader(ns))
                    {
                        var streamSize = br.ReadInt32();

                        var res = br.ReadBytes(streamSize);

                        var ms = new MemoryStream(res);
                        ms.Position = 0;
                        return new BinaryReader(ms);
                    }

            }
            }
        }

        public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
        {
            result = null;

            var ms = new MemoryStream();
            var bw = new BinaryWriter(ms);

            bw.Write((byte)CallMethod.CallFunc);
            bw.Write(Target);
            bw.Write(binder.Name);
            bw.Write(args.Length);

            foreach (var arg in args)
                WorkVariants.WriteObject(arg, bw);

            bw.Flush();

          var res= SendMessage(ms);

            var resRun = res.ReadBoolean();
            var returnValue = WorkVariants.GetObject(res, IpEndpoint);
            if (!resRun)
            {
                if (returnValue != null && returnValue.GetType() == typeof(string))
                    LastError = (string)returnValue;


                return false;
            }

            result = returnValue;
            //  Error=AutoWrap.СообщитьОбОшибке("не найден дженерик тип "+ИмяМетода);
            return true;


        }
    }



И вызов

 Console.OutputEncoding = System.Text.Encoding.UTF8;

        //Process.Start
        Console.WriteLine("Hello Client!");

        var wrap = Client.AutoWrapClient.GetProxy("127.0.0.1", 6891);

        int res = wrap.ReturnParam(3);
        Console.WriteLine(res);

        string str = wrap.ReturnParam("Hello"); // Возвращает параметр 
        Console.WriteLine(str);
        Console.WriteLine(wrap.ReturnParam(3.14));
        Console.WriteLine(wrap.ReturnParam(DateTime.Now));

        decimal dc = 678.89M;
        Console.WriteLine(dc);
        var stopWatch = new System.Diagnostics.Stopwatch();
        int count = 0;
        stopWatch.Start();
        for (int i = 0; i < 10000; i++)
        {
            count += wrap.ReturnParam(i);

        }

        stopWatch.Stop();
        var ts = stopWatch.Elapsed;
        var elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds,
   ts.Milliseconds / 10, 0);

        Console.WriteLine(count);
        Console.WriteLine(elapsedTime);
        Console.ReadLine();