Сообщение Re[8]: .Net Core, AppDomain, RPC свой велосипед от 28.02.2017 16:45
Изменено 28.02.2017 16:47 Serginio1
Re[8]: .Net Core, AppDomain, RPC свой велосипед
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, Serginio1, Вы писали:
AVK>>>Не знаю что ты там понимаешь под сервером, но tcp сервер пишется на дотнете в одно выражение.
S>>Ну не в одно.
AVK>Именно что в одно.
S>> Но обработку запросов кто писать будет?
AVK>Лямбды пока еще не отменили.
А лямбды кто писать будет?
По твоему и HTTP сервер тоже можно не писать.
Вот как сейчас выглядит обработка
AVK>Здравствуйте, Serginio1, Вы писали:
AVK>>>Не знаю что ты там понимаешь под сервером, но tcp сервер пишется на дотнете в одно выражение.
S>>Ну не в одно.
AVK>Именно что в одно.
S>> Но обработку запросов кто писать будет?
AVK>Лямбды пока еще не отменили.
А лямбды кто писать будет?
По твоему и HTTP сервер тоже можно не писать.
Вот как сейчас выглядит обработка
private void RunMethod(NetworkStream ns, MemoryStream ms, IPAddress adress)
{
using (BinaryReader br = new BinaryReader(ms))
{
var msRes = new MemoryStream();
using(BinaryWriter bw= new BinaryWriter(msRes))
{
var cm = (CallMethod)br.ReadByte();
switch (cm)
{
case CallMethod.CallFunc: CallAsFunc(br, bw); break;
case CallMethod.GetMember: GetPropVal(br, bw); break;
case CallMethod.SetMember: SetPropVal(br, bw); break;
case CallMethod.CallFuncAsync: CallAsyncFunc(br, bw, adress); break;
case CallMethod.CallDelegate: CallAsDelegate(br, bw); break;
case CallMethod.CallGenericFunc: CallAsGenericFunc(br, bw); break;
case CallMethod.GetWrapperForObjectWithEvents: GetWrapperForObjectWithEvents(br, bw, adress); break;
case CallMethod.GetIndex: GetIndex(br, bw); break;
case CallMethod.SetIndex: SetIndex(br, bw); break;
case CallMethod.IteratorNext: IteratorNext(br, bw); break;
case CallMethod.DeleteObjects: DeleteObjects(br, bw); break;
}
bw.Flush();
SetResult(msRes, ns);
}
}
}
private void ExecuteMethod(TcpClient client)
{
var adress=((IPEndPoint)client.Client.RemoteEndPoint).Address;
// client.Client.NoDelay = true;
using (NetworkStream ns = client.GetStream())
{
// Получим данные с клиента и на основании этих данных
//Создадим ДанныеДляКлиета1С котрый кроме данных содержит
//TcpClient для отправки ответа
using (var br = new BinaryReader(ns))
{
var streamSize = br.ReadInt32();
var res = br.ReadBytes(streamSize);
var ms = new MemoryStream(res);
ms.Position = 0;
RunMethod(ns, ms, adress);
}
}
}
static bool GetAW(BinaryReader br, BinaryWriter bw, out NetObjectToNative.AutoWrap AW )
{
var Target = br.ReadInt32();
AW = NetObjectToNative.AutoWrap.ObjectsList.GetValue(Target);
if (AW == null)
{
SetError("Не найдена ссылка на объект", bw);
return false;
}
return true;
}
public static bool CallAsFuncAll(BinaryReader br, BinaryWriter bw, out object result, bool WriteResult)
{
result = null;
NetObjectToNative.AutoWrap AW;
if (!GetAW(br, bw, out AW))
return false;
string MethodName = br.ReadString();
var args = GetArrayParams(br);
string Error;
List<int> ChageParams = new List<int>();
var res = AW.TryInvokeMember(MethodName, args, out result, ChageParams, out Error);
if (!res)
{
SetError(Error, bw);
return false;
}
if (WriteResult)
{
bw.Write(true);
WorkWhithVariant.WriteObject(NetObjectToNative.AutoWrap.WrapObject(result), bw);
WriteChandeParams(bw, args, ChageParams);
}
return true;
}
Re[8]: .Net Core, AppDomain, RPC свой велосипед
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, Serginio1, Вы писали:
AVK>>>Не знаю что ты там понимаешь под сервером, но tcp сервер пишется на дотнете в одно выражение.
S>>Ну не в одно.
AVK>Именно что в одно.
S>> Но обработку запросов кто писать будет?
AVK>Лямбды пока еще не отменили.
А лямбды кто писать будет?
По твоему и HTTP сервер тоже можно не писать.
Вот как сейчас выглядит обработка
AVK>Здравствуйте, Serginio1, Вы писали:
AVK>>>Не знаю что ты там понимаешь под сервером, но tcp сервер пишется на дотнете в одно выражение.
S>>Ну не в одно.
AVK>Именно что в одно.
S>> Но обработку запросов кто писать будет?
AVK>Лямбды пока еще не отменили.
А лямбды кто писать будет?
По твоему и HTTP сервер тоже можно не писать.
Вот как сейчас выглядит обработка
static void SetResult(MemoryStream ms, NetworkStream ns)
{
ms.Position = 0;
ns.Write(BitConverter.GetBytes((Int32)ms.Length), 0, 4);
ms.CopyTo(ns);
ns.Flush();
}
private void RunMethod(NetworkStream ns, MemoryStream ms, IPAddress adress)
{
using (BinaryReader br = new BinaryReader(ms))
{
var msRes = new MemoryStream();
using(BinaryWriter bw= new BinaryWriter(msRes))
{
var cm = (CallMethod)br.ReadByte();
switch (cm)
{
case CallMethod.CallFunc: CallAsFunc(br, bw); break;
case CallMethod.GetMember: GetPropVal(br, bw); break;
case CallMethod.SetMember: SetPropVal(br, bw); break;
case CallMethod.CallFuncAsync: CallAsyncFunc(br, bw, adress); break;
case CallMethod.CallDelegate: CallAsDelegate(br, bw); break;
case CallMethod.CallGenericFunc: CallAsGenericFunc(br, bw); break;
case CallMethod.GetWrapperForObjectWithEvents: GetWrapperForObjectWithEvents(br, bw, adress); break;
case CallMethod.GetIndex: GetIndex(br, bw); break;
case CallMethod.SetIndex: SetIndex(br, bw); break;
case CallMethod.IteratorNext: IteratorNext(br, bw); break;
case CallMethod.DeleteObjects: DeleteObjects(br, bw); break;
}
bw.Flush();
SetResult(msRes, ns);
}
}
}
private void ExecuteMethod(TcpClient client)
{
var adress=((IPEndPoint)client.Client.RemoteEndPoint).Address;
// client.Client.NoDelay = true;
using (NetworkStream ns = client.GetStream())
{
// Получим данные с клиента и на основании этих данных
//Создадим ДанныеДляКлиета1С котрый кроме данных содержит
//TcpClient для отправки ответа
using (var br = new BinaryReader(ns))
{
var streamSize = br.ReadInt32();
var res = br.ReadBytes(streamSize);
var ms = new MemoryStream(res);
ms.Position = 0;
RunMethod(ns, ms, adress);
}
}
}
static bool GetAW(BinaryReader br, BinaryWriter bw, out NetObjectToNative.AutoWrap AW )
{
var Target = br.ReadInt32();
AW = NetObjectToNative.AutoWrap.ObjectsList.GetValue(Target);
if (AW == null)
{
SetError("Не найдена ссылка на объект", bw);
return false;
}
return true;
}
public static bool CallAsFuncAll(BinaryReader br, BinaryWriter bw, out object result, bool WriteResult)
{
result = null;
NetObjectToNative.AutoWrap AW;
if (!GetAW(br, bw, out AW))
return false;
string MethodName = br.ReadString();
var args = GetArrayParams(br);
string Error;
List<int> ChageParams = new List<int>();
var res = AW.TryInvokeMember(MethodName, args, out result, ChageParams, out Error);
if (!res)
{
SetError(Error, bw);
return false;
}
if (WriteResult)
{
bw.Write(true);
WorkWhithVariant.WriteObject(NetObjectToNative.AutoWrap.WrapObject(result), bw);
WriteChandeParams(bw, args, ChageParams);
}
return true;
}