Серверный сокет UDP не может проанализировать все полученные данные - PullRequest
0 голосов
/ 25 мая 2018

Я реализую модель клиент-сервер, используя UDP .Клиент отправляет данные серверу, и в дополнение к его получению серверу также необходимо проанализировать их.Теперь, если я не разбираю данные после их получения, сервер записывает в файл 100% данных.Но при разборе он задерживается и некоторые данные не записываются в выходной файл.

Код сервера:

        while True:
            data, addr = s.recvfrom(1024)

            #I used pickle since the data is an array
            csv_writer.writerow(pickle.loads(data))


            #Stating to parse the data now:
            arr = pickle.loads(data) <---- The data I need to parse is an array

            # If the key exists in the dictionary,
            # increment the value by one
            currentMessageID = arr[0]
            if (dictOfMessageID.has_key(currentMessageID)):
                dictOfMessageID[currentMessageID] += 1

            # # If the key doesn't exists in dictionary
            # # add the key-value pair
            else:
                dictOfMessageID[currentMessageID] = 1

Как я могу решить эту проблему?серверу все еще нужно записать все данные и проанализировать их ИЛИ я что-то упустил, и пакеты UDP будут потеряны в этой ситуации?

1 Ответ

0 голосов
/ 26 мая 2018

Первое, что я бы попробовал, это увеличить буфер входящих данных вашего сокета UDP (например, через sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 128*1024)), чтобы уменьшить вероятность его переполнения во время анализа данных.

Если это не такдостаточно, проделав дополнительную работу, вы можете разделить прием и анализ данных, добавив полученные пакеты в список / очередь (вместо того, чтобы сразу их анализировать) и либо проанализировав их позже (после получения всех пакетов), либов отдельном потоке (с более низким приоритетом), чтобы прием входящих пакетов не задерживался.

Если это по-прежнему не обеспечивает достаточной надежности, возможно, вы захотите перестроить свою систему для использованияTCP-поток, а не UDP-пакеты, поскольку TCP-поток автоматически уменьшает скорость передачи в соответствии со скоростью принимающей программы и автоматически отправляет пакеты по мере необходимости, если / когда они по какой-либо причине отброшены.

Обратите внимание, что UDPпакеты могут и будут потеряны по любой причине, нет ситуацииИон, в котором гарантированно будут доставлены пакеты UDP.Если вы собираетесь использовать UDP, это факт жизни, с которым вам придется либо мириться, либо найти какой-то механизм для восстановления.

...