Теперь у вас есть простое «получить сообщение, передать его всем» типа клиента и сервера. Как написано в комментариях, мы не пишем код для вас, но вот пара идей, которые вы могли бы использовать.
Во-первых, вам нужно создать протокол. Теперь вы рассматриваете все, что сервер получает как сообщение, и транслируете его на другие соединения Если вам теперь нужно обслуживать публичные (широковещательные сообщения для всех) и личные сообщения (отправлять только определенному пользователю), сервер должен знать имена пользователей. Сервер должен также различать публичные и личные сообщения.
Например, на вашем сервере может потребоваться, чтобы первое сообщение, полученное по новому соединению, было
REGISTER username
Затем вы узнаете это сообщение, и вместо набора для клиентов вы измените его на словарь и в качестве ключа будете использовать имя пользователя
clients[username] = client_sock
или что-то в этом роде.
когда ваши клиентские потоки получают сообщение, они также анализируют его. Возможные сообщения могут быть
PUBLICMESSAGE message
PRIVATEMESSAGE username message
Если вы получите публичное сообщение, вы будете делать то, что делаете сейчас. Если вы получите личное сообщение, вы получите сокет, куда отправить
try:
client = clients[username]
send_message(client, message)
except KeyError:
Send an error message back stating the target user is not online
Это всего лишь указатели. Вам нужен протокол, потому что вам нужно различать публичные и личные сообщения, и вам нужны средства, чтобы сервер знал, какое у вас имя пользователя, чтобы он мог использовать его в качестве идентификатора. Затем вам нужно немного разобрать, чтобы отделить ключевые слова протокола от сообщений.
Я также хотел бы указать вам на предыдущий ответ, который я написал некоторое время назад. Python: многопоточный сервер сокетов работает бесконечно, когда клиент неожиданно останавливается Пожалуйста, прочитайте последние параграфы, начиная с "TCP-сокеты передают данные, а не сообщения". Теперь ваш сервер не обслуживает сценарии 3-5, но он должен. Это становится более важным, когда вы создаете протокол, так как вы будете ошибаться во многих отношениях, если вы получите от сокета больше, чем вы предполагали, как если бы вы глотали последовательные ключевые слова протокола.