Как предотвратить сообщения сокета Python от наложения в консоли? - PullRequest
0 голосов
/ 08 марта 2019

У меня есть система чата Python, которая использует 1 поток для ввода пользователя и другой поток для получения и печати сообщений.Проблема заключается в следующем: если я получаю сообщение одновременно с вводом данных пользователем, текст сообщения попадает в строку ввода, а не в отдельную строку.Как мне поступить с этим?

Короткая версия моего кода:

def receive(cl,buffer):
    msg = str(cl.recv(1024).decode())
    print(msg)

_thread.start_new_thread(receive,(client,1024,))

while True:
    msg = input("message:")
    send(message)

Например: если я получаю "привет мир" с сервера, пока я пишу "привет"сервер "в консоли, это будет выглядеть следующим образом

" привет мир сообщение: привет сервер "

Ответы [ 2 ]

0 голосов
/ 09 марта 2019

Я решил создать графический интерфейс для системы, чтобы я мог отображать входящие сообщения в виджете и обрабатывать ввод из другого виджета.

0 голосов
/ 09 марта 2019

В идеале используйте два разных окна для ввода и вывода. Рассмотрим существующие приложения чата, в которых есть окно для ввода вашего сообщения отдельно от окна, в котором отображаются как ваши сообщения, так и сообщения других пользователей. В противном случае вы можете печатать, когда приходит другое сообщение.

В качестве альтернативы используйте threading.Lock() для сериализации вывода. Только нить, удерживающая блокировку, может выводить. К сожалению, если у вас есть:

with lock:
    msg = input('message: ')

Никакая другая нить не может ничего напечатать, пока вы не закончите печатать свое сообщение. Еще одна причина использовать отдельные окна для ввода и вывода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...