Я не большой специалист, но есть опыт по сокетам TCP. Внесу свои 5 копеек.
Потоки нужны, да, потому что любые тормоза связи очень пагубно сказываются на приложении, все виснет и залипает, если это не выведено отдельным потоком. Особенно если не используете уже проверенную
http://wiki.freepascal.org/lNet библиотеку, например под андроид пишете.
Для чего разносить получение и отправку я не понимаю, если сервер - то слушать и при коннекте отправлять и получать в сокет, если клиент - коннектится и тем же образом работать. Вы на обоих сторонах будете и сервер и клиент держать? А как с номером порта тогда? Он не может же быть и сервером и клиентом одновременно вроде. Какие-то кластеризованные сервера делаете?
Как я обошел (как раз про андроид речь, делал из телефона мышку на комп): Мысль трогать родителя (основной поток) из фоновых потоков мне в голову не приходила, я подумал что родительский поток должен сказать что то типа "соединись, слушай порт и если что передавай полученное мне", а подчиненный поток маниакально должен проверять доступность и возвращать если что-то получено в главный, ну и об ошибках говорить. Только клиент сокет - сервер у меня на компе там lnet с отлично реализованным серверным сокетом.
Написал свой вариант объекта сокета, где расписал все про получение и отправку данных. Это кстати позволяет не в потоке отладить. У меня проблемы с отладчиком в потоках (((. Потом сделал объект поток, который с этим сокетом работает, а его уже обернул в объект клиент-сокет наследник первого сокета но с потоком внутри.
Объяснил несколько путанно, но могу выложить модуль почитать. Надо?