async/await tcp клиент сервер принимающий много клиентов

Кто-нибудь покажите пример асинхронного подключения каждого клиента к серверу через async/await без всяких while(true) и левых потоков, ни одного нормального решения не нашёл в интернете.
Нужен простой пример беспрерывного подключения от клиента к серверу чтобы принимал подключения многих клиентов и чтобы от сервера отходило какое-нибудь сообщение клиентам которые подключились.


Ответы (1 шт):

Автор решения: Mark Shevchenko

Не совсем понятно, почему пример должен быть без while (true). Это стандартный способ построения такого рода приложений.

Если объясните, зачем, попробую переписать нужным образом.

Сервер

using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading.Tasks;

namespace TcpServer
{
    class Program
    {
        static async Task Main(string[] args)
        {
            var ipAddress = new IPAddress(new byte[] { 0, 0, 0, 0 });
            var tcpListener = new TcpListener(ipAddress, 8100);
            tcpListener.Start();

            try
            {
                await Console.Out.WriteLineAsync("Server started at 0.0.0.0:8100");

                while (true)
                {
                    var tcpClient = await tcpListener.AcceptTcpClientAsync();

                    await ProcessRequest(tcpClient);
                }
            }
            finally
            {
                tcpListener.Stop();
                await Console.Out.WriteLineAsync("Server finished");
            }
        }

        static async Task ProcessRequest(TcpClient tcpClient)
        {
            await Task.Yield();

            var stream = tcpClient.GetStream();
            using var reader = new StreamReader(stream, leaveOpen: true);
            var line = await reader.ReadLineAsync();

            using var writer = new StreamWriter(stream, leaveOpen: true);
            await writer.WriteLineAsync($"'{line}' recieved");
            await writer.FlushAsync();
        }
    }
}

Клиент

using System;
using System.IO;
using System.Threading.Tasks;

namespace TcpClient
{
    class Program
    {
        static async Task Main(string[] args)
        {
            using var tcpClient = new System.Net.Sockets.TcpClient("127.0.0.1", 8100);

            string line;
            while ((line = Console.ReadLine()) != "")
            {
                var stream = tcpClient.GetStream();
                using var writer = new StreamWriter(stream, leaveOpen: true);

                await writer.WriteLineAsync(line);
                await writer.FlushAsync();

                using var reader = new StreamReader(stream, leaveOpen: true);
                var answer = await reader.ReadLineAsync();

                await Console.Out.WriteLineAsync($"Answer: {answer}");
            }
        }
    }
}
→ Ссылка