Сообщение 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 вызовов в секунду. Даже не знаю это много или мало?
Вот клиент
И вызов
Вобщем сделал на 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 вызовов в секунду. Даже не знаю это много или мало?
Вот клиент
И вызов
Вобщем сделал на 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();