Многопоточное клиент-серверное приложение TCP
Подскажите, как лучше реализовать часть подключения и обработки клиента.
Когда пытался найти решение в интернете, находил только простые примеры, где вся обработка заключалась в отправке сообщения на сервер и получения ответа и всё.
Я же пытаюсь сделать сервер, который создаёт поток для каждого клиента, где происходит неоднократные обмены данными.
У меня происходит какая-то вакханалия, и сервер начинает хавать больше оперативки с каждым новым сообщением от клиента, доходя до 11 гб. Подозреваю, что сервак создаёт отдельный поток для каждого сообщения, и это объясняет, почему моя программа не выполняет задачу как надо.
Вот мой код:
static void Main (string [] args)
{
const string ip = "127.0.0.1";
const int port = 8080;
var tcpListener = new TcpListener(IPAddress.Parse(ip), port);
try
{
tcpListener.Start();
while (true)
{
Task.Run(async () => await ProcessClientAsync());
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
tcpListener.Stop();
}
async Task ProcessClientAsync()
{
var tcpClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
var df = new DataFilter();
await Task.Run(() =>
{
while (true)
{
tcpClient = tcpListener.AcceptSocket();
string BackAnswer;
var datatraider = new DataEncoder(tcpClient);
int state = df.TakingData(datatraider.message);
if (state == 2)
{
BackAnswer = "false";
}
else if (state == 1)
{
BackAnswer = "true";
}
else
{
break;
}
var data = Encoding.UTF8.GetBytes(BackAnswer);
tcpClient.Send(data);
}
});
tcpClient.Close();
}
}
Источник: Stack Overflow на русском