Создаем портфолио за 1 месяц
К концу месяца: 4 классных проекта в вашем портфолио! Стоимость: 100$. Подробности...
⊗csSpSoExc 485 of 509 menu
◀ ▶

Обмен в одном запуске в C#

Полный цикл в одном процессе ведут две задачи: одна ждет AcceptTcpClientAsync, другая вызывает ConnectAsync к 127.0.0.1 и порту 18080.

Сначала клиент пишет строку, затем читает ответ - порядок важен, иначе стороны ждут друг друга. Ответ сервера читает клиент. В конце дождёмся задачи сервера; соединения закроются через using:

using System.Net; using System.Net.Sockets; using System.Text; Task server = Task.Run(async () => { TcpListener listener = new(IPAddress.Loopback, 18080); listener.Start(); using TcpClient peer = await listener.AcceptTcpClientAsync(); using NetworkStream stream = peer.GetStream(); byte[] buf = new byte[256]; await stream.ReadAsync(buf); string reply = "status: done\n"; await stream.WriteAsync(Encoding.UTF8.GetBytes(reply)); listener.Stop(); }); await Task.Delay(50); using TcpClient client = new(); await client.ConnectAsync("127.0.0.1", 18080); using NetworkStream stream = client.GetStream(); await stream.WriteAsync(Encoding.UTF8.GetBytes("go\n")); byte[] buf = new byte[256]; int got = await stream.ReadAsync(buf); Console.WriteLine(Encoding.UTF8.GetString(buf, 0, got).TrimEnd()); // выведет "status: done" await server;

Сервер может добавить к ответу прочитанный текст. Клиент печатает готовую строку целиком - так видно, что обмен завершился в рамках одного запуска:

using System.Net; using System.Net.Sockets; using System.Text; Task server = Task.Run(async () => { TcpListener listener = new(IPAddress.Loopback, 18080); listener.Start(); using TcpClient peer = await listener.AcceptTcpClientAsync(); using NetworkStream stream = peer.GetStream(); byte[] buf = new byte[256]; int n = await stream.ReadAsync(buf); await stream.WriteAsync(Encoding.UTF8.GetBytes("echo:" + Encoding.UTF8.GetString(buf, 0, n))); listener.Stop(); }); await Task.Delay(30); using TcpClient client = new(); await client.ConnectAsync("127.0.0.1", 18080); using NetworkStream stream = client.GetStream(); await stream.WriteAsync(Encoding.UTF8.GetBytes("ping\n")); byte[] buf = new byte[256]; int got = await stream.ReadAsync(buf); Console.WriteLine(Encoding.UTF8.GetString(buf, 0, got).TrimEnd()); await server;

Отправьте "start\n" на 127.0.0.1 и выведите в консоли ответ "begin: start", который собрал сервер.

Выведите в консоли клиента строку "ok", если сервер получил "check".

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить