Я изо всех сил пытаюсь добиться некоторого «точного» обмена данными с использованием сокетов. У меня есть программа, способная отправлять / получать файлы с использованием этих сокетов, и я подготовил ее для отправки на первом этапе имя файла и размер файла .
Кажется, все работает нормально, но иногда полученные данные не ожидаемые. Я предполагаю, что полученные данные относятся к двум «операциям отправки» Tx, которые поступают вместе, поэтому предполагаемый «синтаксический анализ» полученной строки не является правильным, и он дает сбой.
В настоящее время мой код выглядит так для приемника :
while True:
c, addr = self.s.accept()
l = c.recv(1024)
while (l):
if stage < 2:
self.__recvHeader(l)
stage += 1
else:
self.f.write(l)
l = c.recv(1024)
Будучи функцией __recvHeader
:
def __recvHeader(self, data):
line = data.decode("utf-8").split(":")
if line[0] == "Name":
self.filename = line[1]
self.f = open("/tmp/" + self.filename, 'wb')
elif line[0] == "Size":
self.size = int(line[1])
else:
print("ERROR: " + "".join(line))
А Tx любит:
# Here I send some headers first, then
l = f.read(1024)
while (l):
self.s.send(l)
l = f.read(1024)
При использовании функции sendHeader :
def __sendHeader(self, name, value):
self.s.send((name + ":" + value).encode('utf-8'))
Мне кажется, что проблема в том, что я не могу установить фиксированную длину для заголовков, так как имя файла и размер файла могут измениться.
Есть идеи о том, как решить эту проблему, или как я могу превратить эти данные во что-то фиксированного размера, чтобы избежать этой проблемы? Этот последний вариант также потребовал бы другого "разбора" IMO, не так ли?