#python #sockets #pickle
#питон #розетки #соленый огурец
Вопрос:
Длина рассола.отвал(рама) = 921 765
Продолжительность отправки и получения данных = 3 517 145
Я не понимаю, почему моя свалка маринованных огурцов и то, что я отправляю и получаю, имеют совершенно разные размеры. Я предполагаю, что это потому, что я превращаю дамп в строку с f"set frame {data}"
помощью, а затем кодирую его в Protocol_Send.
ниже — вот где рассол.инициируется сброс.
def Start_Camera(self): self.start = True camera =cv2.VideoCapture(0) while self.start: success, frame = camera.read() if not success: break else: data = pickle.dumps(frame) #LENGTH OF THIS IS 921,765 Protocol_Send(self.device.server, f"set frame {data}")
Я отправляю свои данные со следующими Protocol_Send(self.device.server, f"set frame {data}")
вот функция Protocol_Send
def Protocol_Send(connection, message): try: if message == "": return if type(message) == str: #make sure our message is a string message = message.encode() #Encode the string length = str(len(message)).zfill(10) #Get the length of the string and make the number 4 digits regardless connection.send(length.encode()) #Send the length of the next data block connection.send(message) #Send the datablock except Exception as e: print(e)
Когда данные получены сервером, который я использую Protocol_Receive
, он переходит во вспомогательную функцию для анализа команд, а затем передается команде Set_Frame
def Protocol_Receive(connection): data = "" length = int(connection.recv(10)) #Every message comes prefaced with a 10 bit size. while length gt; 16384: message = connection.recv(16384) data = message.decode() length -= 16384 if length gt; 0: message = connection.recv(length) data = message.decode() length = 0 return data
фрейм-это список данных, поэтому я просто присоединяюсь к нему. Данные собираются правильно, и в начале пропускается команда set frame. не оставляя ничего, кроме исходных данных дампа для рассола (очевидно, это не исходный дамп, хотя, потому что он в 3 раза больше, чем при отправке и получении).
def Set_Frame(device, frame): device = Device.devices[device] frame = "".join(frame) frame = frame.encode('utf8') frame = pickle.loads(frame) for module in device.modules: if module.archetype == "camera": module.Set_Camera_Frame(frame)
Он ломается на рассоле.грузы(рама) с UnpicklingError('unpickling stack underflow')
Комментарии:
1. Я немного обеспокоен тем, что вы кодируете() все сообщение, но декодируете() его в 16 КБ байт. Возможно, вы разделяете двухбайтовую сущность. Лучше получить все сообщение целиком, а затем преобразовать его в данные. Хотя не знаю, в этом ли твоя проблема.