Делаю своего рода RPC. Интересует скорость обмена по TCP/IP
Сейчас сорость обмена составляет 2000 вызовов в секунду.
Но чувствую, что скорость может быть больше.
Клиент такой
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 void Open(int НомерПорта = 6891, int КоличествоСлушателей = 1)
{
IsClosed = false;
IPEndPoint ipEndpoint = new IPEndPoint(IPAddress.Any, НомерПорта);
Server = new TcpListener(ipEndpoint);
Server.Start();
// Создадим задачи для прослушивания порта
//При подключении клиента запустим метод ОбработкаСоединения
// Подсмотрено здесь https://github.com/imatitya/netcorersi/blob/master/src/NETCoreRemoveServices.Core/Hosting/TcpServerListener.cs
for (int i = 0; i < КоличествоСлушателей; i++)
Server.AcceptTcpClientAsync().ContinueWith(OnConnect);
}
// Метод для обработки сообщения от клиента
private void OnConnect(Task<TcpClient> task)
{
if (task.IsFaulted || task.IsCanceled)
{
// Скорее всего вызвано Server.Stop();
return;
}
// Получим клиента
TcpClient client = task.Result;
// И вызовем метод для обработки данных
//
ExecuteMethod(client);
// Если Server не закрыт то запускаем нового слушателя
if (!IsClosed)
Server.AcceptTcpClientAsync().ContinueWith(OnConnect);
}
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)
{
using (BinaryReader br = new BinaryReader(ms))
{
var msRes = new MemoryStream();
using(BinaryWriter bw= new BinaryWriter(msRes))
{
var cm = (CallMethod)br.ReadByte();
if (cm == CallMethod.CallFunc)
{
CallAsFunc(br, bw);
}
bw.Flush();
SetResult(msRes, ns);
}
}
}
private void ExecuteMethod(TcpClient client)
{
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);
}
}
}
Вызов через DinamicObject
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);
var Тестовый = wrap.Тип("TestDllForCoreClr.Тестовый", "TestDll");
var TO = wrap.New(Тестовый,"Свойство из Конструктора");
int rs = TO.ПолучитьЧисло(89);
count = 0;
stopWatch.Restart();
for (int i = 0; i < 10000; i++)
{
count += TO.ПолучитьЧисло(i);
}
stopWatch.Stop();