Никогда не использовал TServerSocket и TClientSocket самостоятельно, и у меня нет файлов справки в пределах досягаемости, поэтому я не могу сразу увидеть, будет ли это работать с этими компонентами.
Для проекта, который я сделал, мне тоже нужно было что-то подобное. В итоге я использовал UDP для трансляции запроса на обнаружение (конечно, в той же подсети). Сервер, прослушивающий конкретный порт для такого запроса, ответит своими данными обратно. Когда существует несколько серверов (что может случиться редко), клиент просто выбирает сервер с необходимыми услугами и наименьшей нагрузкой. Эта нагрузка была частью данных, которые сервер отправлял обратно.
Это сработало хорошо, не так уж сложно написать, и оказалось достаточно эффективным.
Протокол запроса полностью зависит от вас. Тот, который я разработал, позволил клиентам отправлять запрос с подробным описанием услуг, которые им нужны, а серверы отвечали, перечисляя свои услуги и нагрузку (= подключенные клиенты в активном использовании).
После выбора сервера для общения клиент регистрирует себя для необходимых ему сервисов и может использовать их после этого.
Надеюсь, это поможет.