Вы можете определить идентификатор типа запроса.Затем на стороне реализации SocketServer вы можете проанализировать идентификатор и передать запрос новому потоку, используемому для обработки этого типа запроса.Таким образом, в вашем случае вы бы определили 3 разных обработчика, и для каждого типа вы получаете запрос, который вы выбираете, какой обработчик использовать для обработки запроса.Каждый запрос будет выполняться с использованием одного и того же сокета.
Однако из вашего последнего предложения:
Мне нужно: отправляю первым, получаю ответ первым, отправляю вторым получаюответ от второго, я отправляю третий, я получаю ответ от третьего и так далее
Это не похоже на параллельные запросы.Скорее звучит так, будто вы хотите запускать их один за другим, то есть второй запрос зависит от ответа первого запроса.Если это так, то вы просто используете один и тот же сокет (не создавайте новый для каждого запроса).Тогда логикой в коде запроса будет просто отправить запрос 1, дождаться ответа 1, затем отправить запрос 2 и т. Д. И т. Д.