Для пункта 2: Когда я писал похожую программу, я создал класс под названием «Соединение», который включал в качестве членов сокет и псевдоним строки.Класс расширил класс Thread.
Таким образом, всякий раз, когда был создан новый сокет, он вставлялся в такой объект, который затем выполнялся бы как отдельный поток, прослушивая новые сообщения.Эти объекты вставлялись в список всякий раз, когда он был создан, а затем удалялись соответствующим образом при выходе пользователя из системы.