Для взаимодействия ты используешь TCP.
Connect()
возвращается, когда установлено соединение, но само соединение все еще может находиться в очереди - то, что здесь и происходит.
Поэтому, лучше такое решение:
const int maxPartySize = 2;
var party = new List<TcpClient>();
var locker = new object();
var ip = IPAddress.Loopback;
var port = 50000;
var server = new TcpListener(ip, port);
server.Start(128);
Console.WriteLine("Сервер запущен..");
while (true)
{
var client = await server.AcceptTcpClientAsync();
_ = ProcessClientAsync(client);
Console.WriteLine($"Клиент {client.Client.RemoteEndPoint} подключен. Текущий размер группы: {party.Count}");
}
async Task ProcessClientAsync(TcpClient client)
{
await Task.Yield();
bool added;
lock (locker)
{
if (added = party.Count < maxPartySize)
{
party.Add(client);
}
}
if (added)
{
Console.WriteLine($"Клиент {client.Client.RemoteEndPoint} добавлен в группу");
}
else
{
Console.WriteLine($"Клиент {client.Client.RemoteEndPoint} НЕ добавлен в группу");
}
client.Close();
}
P.S. когда принимаешь клиента не нужно писать
using TcpClient client = ...
иначе клиент закроется до начала его обработки