Несколько сообщений в C#
Одно TCP-соединение может передать несколько
сообщений подряд без нового ConnectAsync.
Каждую порцию байтов отправляют отдельным
WriteAsync на том же соединении. Перевод строки
попадает в данные, только если его отправили сами.
Ниже клиент пишет "one" и "two" двумя
вызовами и закрывает отправку через Shutdown.
Сервер читает в цикле, пока вызов не вернет
0: так видно, что клиент больше не пишет.
Затем накопленный текст режут по \n:
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];
string text = "";
while (true)
{
int n = await stream.ReadAsync(buf);
if (n == 0)
{
break;
}
text += Encoding.UTF8.GetString(buf, 0, n);
}
foreach (string line in text.Split(
'\n', StringSplitOptions.RemoveEmptyEntries))
{
Console.WriteLine(line);
}
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("one\n"));
await stream.WriteAsync(Encoding.UTF8.GetBytes("two\n"));
client.Client.Shutdown(System.Net.Sockets.SocketShutdown.Send);
await server;
Клиент два раза отправляет строку и читает ответ "ack". Печатается сумма длин двух ответов: каждая строка "ack\n" занимает 4 байта:
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];
for (int i = 0; i < 2; i++)
{
int n = await stream.ReadAsync(buf);
await stream.WriteAsync(Encoding.UTF8.GetBytes("ack\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("alpha\n"));
byte[] buf = new byte[256];
int got1 = await stream.ReadAsync(buf);
await stream.WriteAsync(Encoding.UTF8.GetBytes("beta\n"));
int got2 = await stream.ReadAsync(buf);
Console.WriteLine(got1 + got2); // выведет 8
await server;
Отправьте строки "a\n" и "b\n" на
127.0.0.1. В консоли сервера выведите
каждую с префиксом "item: " и закройте
соединение.
Отправьте строки "n1\n" и "n2\n",
прочитайте ответы "got n1" и "got n2"
и выведите их в консоль.