Передать файл через сокет python

Я имею следующее

Client.py

def get_path_file(self):
   try:
       file_path, _ = QFileDialog.getOpenFileName(self, )
       file = open(str(file_path), mode="rb")
       full_name = os.path.basename(file_path)
       
       while True:
           x = file.read(1000)
           print(f"X --- {x}")
           if not x: break
           list_for_server = ["FILE", IDRoom, self.nick_name, self.listWidget_people.currentItem().text(),x, full_name]
           list_for_server = pickle.dumps(list_for_server)
           self.cl.send_data(list_for_server)
   except FileNotFoundError:
       pass

Server.py

while True:  # Accepting a message
   self.signal = socket_user.recv(4096)
   self.signal = pickle.loads(self.signal) 

Короче говоря, я передаю файл по частям, и сервер принимает его, НО после второй итерации я получаю эту ошибку, именно после второй итерации.

  File "/home/n76/.pyenv/versions/3.10.0/lib/python3.10/threading.py", line 1009, in _bootstrap_inner
    self.run()
  File "/home/n76/.pyenv/versions/3.10.0/lib/python3.10/threading.py", line 946, in run
    self._target(*self._args, **self._kwargs)
  File "/home/n76/PycharmProjects/pythonProject/server.py", line 43, in listen_socket
    self.signal = pickle.loads(self.signal)
_pickle.UnpicklingError: invalid load key, ' '.

Однако, если я добавлю time.sleep, все отлично работает, и ошибка не возникает

def get_path_file(self):
    try:
        file_path, _ = QFileDialog.getOpenFileName(self, )
        file = open(str(file_path), mode="rb")
        full_name = os.path.basename(file_path)
        for IDRoom, nameRoom in self.roomsForLoad[0].items():
            if self.listWidget_people.currentItem().text() == nameRoom:
                while True:
                    time.sleep(0.1)    #<--------- THIS
                    x = file.read(1000)
                    print(f"X --- {x}")
                    if not x: break
                    list_for_server = ["FILE", IDRoom, self.nick_name, self.listWidget_people.currentItem().text(),
                                           x, full_name]

                    list_for_server = pickle.dumps(list_for_server)
                    self.cl.send_data(list_for_server)
        except FileNotFoundError:
            pass

Может питон физически не успевает принимать так быстро списки?


Ответы (0 шт):