Обмен в одном запуске в 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".