У меня есть очень простой код, который позволяет мне отправлять изображение с клиента на сервер. И это работает.
Вот так просто:
На стороне клиента...
def sendFile(self):
image = open(picname)
data = image.read()
self.transport.write(data)
На стороне сервера...
def dataReceived(self, data):
print 'Received'
f = open("image.png",'wb')
f.write(data)
f.close()
Проблема в том, что это работает только в том случае, если размер изображения составляет до 4.somethingkB, поскольку он перестает работать, когда изображение становится больше (по крайней мере, не работает, когда достигает 6kB). Затем, когда я вижу, что «Получено» печатается более одного раза. Это заставляет меня думать, что данные разделяются на более мелкие куски. Однако, даже если эти фрагменты данных попадают на сервер (поскольку я вижу повторную печать, вызванную из dataReceived), изображение повреждено и не может быть открыто.
Я не очень разбираюсь в протоколах, но я предположил, что TCP должен быть надежным, поэтому тот факт, что пакеты попали туда в другом порядке или около того, не должен... случиться? Поэтому я подумал, что, возможно, Twisted делает что-то, что я игнорирую, и, возможно, мне следует использовать другой протокол.
Вот мой вопрос. Есть ли что-то, что я мог бы сделать сейчас, чтобы заставить его работать, или мне определенно следует перейти на другой протокол? Если да... есть идеи? Моей целью было бы отправить изображение большего размера, может быть, порядка сотен килобайт.
connectionMade
-connectionLost
, и он сработал хорошо, хотя... думаю, если мне нужна надежная структура, я не должен его использовать. Я хотел бы объединить эту функцию с более крупным проектом, который у меня есть, который использует протокол TCP, поэтому, если бы я мог избежать изменения всего этого кода, было бы здорово. Было бы хорошим вариантом отправить его блоками, как предложил @MartinEvans? Или это все еще будет противоречить какому-то внутреннему механизму Twisted? Спасибо еще раз! 11.11.2015