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

Несколько сообщений в 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" и выведите их в консоль.

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