В зависимости от того, сколько одновременных клиентов вы планируете поддерживать, архитектура потокового соединения, вероятно, очень быстро выйдет из строя. Причина в том, что каждый поток требует значительных ресурсов. По умолчанию каждый поток .NET получает 1 МБ стекового пространства, то есть 1 МБ на соединение плюс любые издержки.
Вместо этого при поддержке нескольких подключенных клиентов обычно вы будете использовать асинхронные методы ( см. Также ), которые очень эффективны, поскольку Windows будет использовать «порты завершения», которые в основном освобождают поток, чтобы делать другие вещи, ожидая завершения какого-либо события.
Для этого вы должны рассмотреть такие методы, как BeginAccept, BeginReceive, BeginSend и т. Д.
Более простой подход, который также позволяет избежать блокирования вызовов и избежать нескольких потоков, состоит в использовании метода Socket.Select в цикле. Это позволяет одному потоку обслуживать несколько сокетов. Поток может только физически читать или записывать в один сокет одновременно, но идея в том, что вы проверяете состояние нескольких сокетов, которые могут содержать или не содержать данные для чтения.
В любом случае, подход «поток-на-соединение» поначалу намного проще, но он имеет значительные проблемы с масштабируемостью. Я бы посоветовал сделать это сначала с синхронными методами, такими как Accept, Receive, Send и т. Д. Затем, позже, рефакторинг вашего кода для использования асинхронных методов, чтобы вы не исчерпали память сервера.