У меня действительно простой код, который позволяет мне отправлять изображение с клиента на сервер. И это работает.Отправка больших файлов в Twisted
Как просто:
На стороне клиента ...
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 делает что-то там, что я игнорирую, и, возможно, мне нужно использовать другой протокол.
Итак, вот мой вопрос. Есть ли что-то, что я мог бы сделать сейчас, чтобы заставить его работать, или я обязательно должен перейти к другому протоколу? Если да ... любая идея? Моя цель - отправить более крупное изображение, возможно, порядка сотен kB.
Вам необходимо отправить его в виде блоков. Храните файл открытым в конце приема и записывайте каждый блок по мере его поступления. Он может поступать в блоки разного размера. –
Чтобы отправить его в блоки, вы можете использовать протокол FileSender (http://twistedmatrix.com/documents/15.4.0/api/twisted.protocols.basic.FileSender.html) \t filesender = basic.FileSender() \t filesender.beginFileTransfer (данные, self.транспорт) –