I make a kind of RPC. Interested in the exchange rate for TCP / IP
Now the exchange rate of the order of 20 bytes is 2000 calls per second. But I feel that the speed can be more. Such a client
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); } } } And server
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); } } } Call through 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();