Сокет Python не обрабатывает все команды - PullRequest
0 голосов
/ 08 апреля 2019

Я работал над реализацией программы сокетов UDP (в основном идея типа сервер / клиент). Я столкнулся с проблемой, когда сервер получает сообщение от клиента, следит за кодом до определенной точки, но затем останавливается, и в следующий раз, когда сервер получает другое сообщение от клиента, он завершает обработку команд предыдущего запрос, затем снова останавливается и повторяется. Это может не иметь смысла, но я постараюсь объяснить с помощью кода.

def receive():
    conn_list = connections()
    routes = []
    sender = -1
    read, write, errors= select.select(conn_list,[],[])
    data = None
    for sock in read:
        data, addr = sock.recvfrom(1024)
        print(data.decode('utf-8'))
        print("hello")

def run():
    filename = input("fielname? ")
    route_table = create_table(filename)
    while True:
        receive()

Сообщение "2. 2. 5. 15000. [4, 2]. [6, 1]" (например) таким образом, ожидаемый результат в консоли при каждом ударе по серверу будет:

    2. 2. 5. 15000. [4, 2]. [6, 1]
    hello

Однако при первом запуске я получаю:

    2. 2. 5. 15000. [4, 2]. [6, 1]

тогда второй раз получаю:

    hello
    2. 2. 5. 15000. [4, 2]. [6, 1]

так что вся консоль после двойного попадания на сервер выглядит так:

    2. 2. 5. 15000. [4, 2]. [6, 1]
    hello
    2. 2. 5. 15000. [4, 2]. [6, 1]

Заранее спасибо за помощь, если у кого-то есть идеи!

1 Ответ

0 голосов
/ 08 апреля 2019

Сложно сказать, что происходит из этого фрагмента кода, поскольку существует много несоответствий, но в таких командах Python, как read, recv блокируются до тех пор, пока (в вашем случае) не будет прочитано 1024 байта или сокет не будет закрыт.Вполне вероятно, что блокирование - это то, что вызывает поведение, которое вы видите.

Я подозреваю, что вы не хотите закрывать сокет после каждой отправки.

В этом случае я могу порекомендовать вам попробовать следующее:

  • Очистить сокет при отправке, чтобы убедиться, что буферизация отсутствует

    fd.flush()
    
  • Используйте «readline» вместо read - это должно быть неблокирующим, если в потоке данных есть «новая строка» или , если точный размер данных известен при отправке,используйте значение для чтения / записи менее 1024 ...

    data = fd.readline()
    
    data = sock.recvfrom(10)
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...