Python запросов последовательности программирования сокетов - PullRequest
0 голосов
/ 27 марта 2020

Я пытаюсь отправить запросы от клиента на базовый сервер, который затем перенаправляет их на еще 2 сервера, к которым подключен базовый сервер.

(Эти 2 сервера находят соответствие с запросом в своем база данных, если она совпадает, они отправляют запрос обратно, если нет совпадения, они ничего не отправляют)

Сначала я отправляю запрос с базового сервера на 1-й сервер с именем ts1, если я не получаю ответ Я отправляю его на второй сервер, который называется ts2. Если я также не получаю ответ от ts2, я отправляю клиенту сообщение об ошибке на хосте.

Я пробовал эти циклы while и inner, чтобы выполнить sh эту задачу, но моя программа зависает после отправки первого запроса. Поскольку сервер ts1 ничего не отправляет в первом запросе.

Как я могу исправить свой код, чтобы он не зависал и весь код выполнялся? может быть его неблокирование или блокировка розеток? Я не знаю, как это реализовано.

    while True:

        # receive a message from the client
        data_from_client = csockid.recv(1024)
        word = data_from_client.decode('utf-8').lower()

        if word == '':

            break

        print('[Client]: ' + word)
        print("[ls Server]: Sending " + word + " to ts1 & ts2 for Query....")

        ts1.send(word.encode('utf-8'))

        while True:

            search_from_ts1 = ts1.recv(1024)
            ts1_server_answer = search_from_ts1.decode('utf-8')

            print("[ls Server]: sending reply from ts1 server " + ts1_server_answer + " to Client")
            csockid.send(ts1_server_answer.encode('utf-8'))

            if not search_from_ts1:

                ts2.send(word.encode('utf-8'))

                while True:

                     search_from_ts2 = ts2.recv(1024)
                     ts2_server_answer = search_from_ts2.decode('utf-8')

                     print("[ls Server]: sending reply from ts2 server " + ts2_server_answer + " to Client")
                     csockid.send(ts2_server_answer.encode('utf-8'))

                     if not search_from_ts2:

                        print("[ls Server]: No match found in both ts1 & ts2")
                        error = " - Error:HOST NOT FOUND"
                        csockid.send(error.encode('utf-8'))

                        break
            break

        if not data_from_client:

            break

Ответы [ 2 ]

0 голосов
/ 27 марта 2020

Обратитесь к разделу неблокирующих розеток в https://docs.python.org/2/howto/sockets.html для справки. В нем рассказывается, как настроить неблокирующие сокеты и как использовать , выберите для опроса более одного сокета.

0 голосов
/ 27 марта 2020

Возможно, вы захотите установить тайм-аут, а затем попробовать другой сервер, но это может сделать код неприемлемо медленным. На этом этапе вы можете захотеть изучить функции asyn c, которые дают вам инструменты для правильного выполнения этой задачи (отправка запроса на оба сервера «одновременно», а затем получение любого доступного, но время ожидания для обоих запрос ответов).

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