Я бы сказал, что лучший способ запустить это приложение - это два отдельных процесса / виртуальных машины, а не два потока. Хотя вы в данный момент запускаете их на одной (виртуальной) машине, весь смысл обмена мгновенными сообщениями - и сокетов - состоит в том, чтобы обеспечить связь между различными процессами, которые могут быть на разных машинах. У вас уже есть два класса - просто убедитесь, что у обоих есть main()
методы, чтобы они могли работать самостоятельно.
Кроме того, если вам нужна полнодуплексная связь, вам нужно иметь два потока на процесс - один для ожидания ввода от пользователя и отправки его на другую сторону, другой для ожидания сообщений от другой стороны и представить их пользователю. Хотя вы можете настроить полудуплексную систему, в которой токен передается назад и вперед по одному сокету, вам, вероятно, будет гораздо проще, если вы установите один входящий сокет и один исходящий сокет на конец.
Если вы хотите осуществлять дуплексную связь с обоих концов, я не думаю, что это действительно отношения клиент / сервер. Если обе стороны могут разговаривать друг с другом на равных, они действительно больше равны. Конечно, есть класс 'server', который прослушивает входящие сообщения, и класс 'client', который отправляет исходящие, но по одному на каждом компьютере. Они очень близко соответствуют потокам отправителя и получателя.