internal static void GetAsyncResult(BinaryReader res, TaskCompletionSource <object> result, TCPClientConnector connector) { object asynchronous = null; if (!GetResult(res, ref asynchronous, connector)) { result.SetException(new Exception(connector.LastError)); } }
public static object GetObject(BinaryReader stream, TCPClientConnector connector) { // Считываем тип объекта EnumVar type = (EnumVar)stream.ReadByte(); // В зависмости от типа считываем и преобразуем данные switch (type) { case EnumVar.VtypeEmpty: case EnumVar.VtypeNull: return(null); case EnumVar.VtypeI2: return(stream.ReadInt16()); case EnumVar.VtypeI4: return(stream.ReadInt32()); case EnumVar.VtypeR4: return(stream.ReadSingle()); case EnumVar.VtypeR8: return(stream.ReadDouble()); case EnumVar.VtypeDecimal: return(stream.ReadDecimal()); case EnumVar.VtypeBool: return(stream.ReadBoolean()); case EnumVar.VtypeI1: return(stream.ReadSByte()); case EnumVar.VtypeUi1: return(stream.ReadByte()); case EnumVar.VtypeUi2: return(stream.ReadUInt16()); case EnumVar.VtypeUi4: return(stream.ReadUInt32()); case EnumVar.VtypeI8: return(stream.ReadInt64()); case EnumVar.VtypeUi8: return(stream.ReadUInt64()); case EnumVar.VtypeChar: return(stream.ReadChar()); case EnumVar.VtypePwstr: return(stream.ReadString()); case EnumVar.VtypeBlob: return(ReadByteArray(stream)); case EnumVar.VtypeDate: return(ReadDateTime(stream)); case EnumVar.VtypeGuid: return(new Guid(stream.ReadBytes(16))); case EnumVar.VtypeAutoWrap: return(new AutoWrapClient(stream.ReadInt32(), connector)); } return(null); }
public AutoWapEnumerator(AutoWrapClient target, TCPClientConnector connector) { _connector = connector; if (!AutoWrapClient.TryInvokeMember( 0, "GetIterator", new object[] { target }, out var result, _connector )) { throw new Exception(_connector.LastError); } _enumerator = (AutoWrapClient)result; }
internal static bool GetResult(BinaryReader res, ref object result, TCPClientConnector connector) { var resRun = res.ReadBoolean(); var returnValue = WorkVariants.GetObject(res, connector); if (!resRun) { if (returnValue != null && returnValue is string stringValue) { connector.LastError = stringValue; } return(false); } result = returnValue; return(true); }
internal static bool TryInvokeMember(int target, string methodName, object[] args, out object result, TCPClientConnector connector) { result = null; var ms = new MemoryStream(); var bw = new BinaryWriter(ms); bw.Write((byte)CallMethod.CallFunc); bw.Write(target); bw.Write(methodName); bw.Write(args.Length); foreach (var arg in args) { WorkVariants.WriteObject(arg, bw); } bw.Flush(); return(GetResultWithChangeParams(connector.SendMessage(ms), ref result, connector, args)); }
public static dynamic GetProxy(TCPClientConnector connector) { return(new AutoWrapClient(0, connector)); }
public AutoWrapClient(int target, TCPClientConnector connector) { Target = target; Connector = connector; }
public AsyncAutoWrapClient(int target, TCPClientConnector connector) : base(target, connector) => GC.SuppressFinalize(this);
internal static bool GetResultWithChangeParams(BinaryReader res, ref object result, TCPClientConnector connector, object[] args, int offset = 0) { if (!GetResult(res, ref result, connector)) { return(false); } var count = res.ReadInt32(); for (int i = 0; i < count; i++) { var index = res.ReadInt32(); // Получим индекс измененного параметра object value = WorkVariants.GetObject(res, connector); // Получим значение измененного параметра // args[index + offset]= value;// Установим нужный параметр, для Generic методов с 0 индексом идет тип аргументов // Вариант с RefParam object param = args[index + offset]; if (param != null && param is RefParam refParam) { refParam.Value = value; } } return(true); }
internal static bool TryInvokeGenericMethod(int target, string methodName, object[] args, out object result, TCPClientConnector connector) { var ms = new MemoryStream(); var bw = new BinaryWriter(ms); bw.Write((byte)CallMethod.CallGenericFunc); bw.Write(target); bw.Write(methodName); var arguments = (object[])args[0]; bw.Write(arguments.Length); foreach (var arg in arguments) { WorkVariants.WriteObject(arg, bw); } bw.Write(args.Length - 1); for (var i = 1; i < args.Length; i++) { WorkVariants.WriteObject(args[i], bw); } bw.Flush(); var res = connector.SendMessage(ms); result = null; return(GetResultWithChangeParams(res, ref result, connector, args, 1)); }
private static void Main(string[] args) { Console.OutputEncoding = System.Text.Encoding.UTF8; int port = 6891; Console.WriteLine("Hello Client!"); //bool loadLocalServer = false; TCPClientConnector connector; //string dir = string.Empty; //if (loadLocalServer) // connector = TCPClientConnector.LoadAndConnectToLocalServer( //GetParentDir(dir, 4) + $@"\Server\bin\Debug\netcoreapp2.2\Server.dll"); //else //{ //3 параметр отвечает за признак постоянного соединения с сервером //Используется пул из 5 соединений connector = new TCPClientConnector("127.0.0.1", port, false); port = TCPClientConnector.GetAvailablePort(6892); connector.Open(port, 2); //} _wrap = AutoWrapClient.GetProxy(connector); // Выведем сообщение в консоли сервера string typeStr = typeof(Console).AssemblyQualifiedName; var console = _wrap.GetType(typeStr); console.WriteLine("Hello from Client"); var str = string.Empty; while (!str.ToLower().Equals("exit")) { Console.Write("Write text to server: "); str = Console.ReadLine(); console.WriteLine(str); } var testClass = (_wrap.GetType("TestClass, Server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"))._new(); var text = testClass.Name(); Console.WriteLine("Текст из клиента + " + text); console.WriteLine(text); GC.Collect(); GC.WaitForPendingFinalizers(); Console.WriteLine("Press any key"); Console.ReadKey(); // Удаления из хранилища на стороне сервера происходит пачками по 50 элементов // Отрправим оставшиеся connector.ClearDeletedObject(); // Отключимся от сервера, закроем все соединения, Tcp/Ip сервер на клиенте connector.Close(); // Если мы запустили процесс сервера // То выгрузим его //if (loadLocalServer) connector.CloseServer(); Console.ReadKey(); }
public WrapperObjectWithEvents(dynamic target, TCPClientConnector connector) { _target = target; _connector = connector; }