Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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);
- }
- }
- }
- 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();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement