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}");
}
}
}
}