Я ответил на вопрос, который звучит удивительно похоже на ваш, когда кто-то выполнил домашнее задание для создания настройки клиентского сервера, при этом каждое соединение обрабатывалось в новой теме: https://stackoverflow.com/a/9522339/496445
Общая идея заключается в том, что у вас есть главный серверный цикл, постоянно ищущий новое соединение для подключения. Когда это происходит, вы передаете его потоку, который затем будет осуществлять собственный мониторинг нового соединения.
Дополнительный бит об асинхронности против потоков
Из асинхронных документов :
Есть только два способа сделать программу на одном процессоре
«Несколько вещей одновременно». Многопоточное программирование - это
Самый простой и популярный способ сделать это, но есть еще один очень
другой метод, который позволяет вам иметь почти все преимущества
многопоточность, без использования нескольких потоков. Это правда
только практично, если ваша программа в основном связана с вводом / выводом. Если ваша программа
привязан к процессору, то приоритетные запланированные потоки, вероятно,
что тебе действительно нужно Сетевые серверы редко связаны с процессором,
однако.
Как следует из этой цитаты, использование асинхронности и потоков должно быть по большей части взаимоисключающими вариантами. Моя ссылка выше является примером подхода с многопоточностью, когда серверный цикл (либо в отдельном потоке, либо в главном) выполняет блокирующий вызов для принятия нового клиента. И когда он получает один, он порождает поток, который затем продолжит обрабатывать связь, и сервер снова возвращается в блокирующий вызов.
В схеме использования асинхронного режима вы вместо этого будете использовать его асинхронный цикл, который, в свою очередь, будет вызывать ваши собственные зарегистрированные обратные вызовы для выполнения различных действий. Здесь нет потоков, а есть опрос всех дескрипторов открытых файлов для активности. Вы чувствуете, что делаете все одновременно, но под капотом все происходит по расписанию.