Как сделать асинхронный слушатель между клиентом и сервером на сокете? - PullRequest
0 голосов
/ 21 мая 2019

в моем проекте мне нужно общаться с моим компьютером Windows, поэтому я создал Socket. Мой сервер был разработан на C ++, а мой клиент на Python.

Чтобы общаться и не прерывать мой основной процесс в Python, я немного прослушал процесс, используя многопроцессорный модуль в Python. Но у меня возникли некоторые проблемы, потому что мне нужно, чтобы queues.get и socket.recv () не блокировали.

Для очередей у ​​меня все в порядке, я установил его: queue.get (block = False) Но у меня проблемы с моим: socket.recv ();

Я попытался установить сокет моего клиента с блокировкой = False с помощью socket.setblocking (), но затем я так и не получил ответ от своего сервера.

Вот моя функция связи с клиентом:

def _main(queue_in, queue_out):
    response = b''

    config.connection.setblocking(0)
    while response != b'exit':
        command = queue_in.get(block=False)
        config.connection.send(command.encode())
        print("Has send")
        try:
            response = config.connection.recv(256)
            print("Wait to receive")
        except:
            pass
        else:
            queue_out.put(response.decode())
            print("received")
    return

А вот функция, с которой я общаюсь с моим клиентом из моего основного Процесса (Да, мой клиент - это подпроцесс):

def _communicate(command):
    queue_in.put(command)
    time.sleep(.5)
    print("Wait for response")
    return queue_out.get()

Queue_in - это место, куда я помещаю команды для отправки на мой сервер. Queue_out - это место, куда я помещаю ответы, полученные от моего сервера.

Мой сервер отправляет обратно команду ввода после каждого действия.

Я ожидал сообщения, подобного этому:

Основной процесс --- "play" ---> Клиентский процесс --- "play" ---> Сервер

Основной процесс <--- "play" --- Клиентский процесс <--- "play --- Сервер </p>

Затем сервер ожидает завершения потока и затем отправляет остановку моему Клиенту:

Концы потоков:

Сервер --- «остановка» ---> Клиентский процесс --- «остановка» ---> Основной процесс

Сервер <--- "выход" --- Клиентский процесс <--- "выход" --- Основной процесс </p>

Спасибо.

...