Python 在Twisted中发送大文件
我有一个非常简单的代码,允许我将一个图像从客户端发送到服务器。它是有效的 就这么简单: 在客户端Python 在Twisted中发送大文件,python,image,file,twisted,Python,Image,File,Twisted,我有一个非常简单的代码,允许我将一个图像从客户端发送到服务器。它是有效的 就这么简单: 在客户端 def sendFile(self): image = open(picname) data = image.read() self.transport.write(data) 在服务器端 def dataReceived(self, data): print 'Received' f = open("
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.3KB时,它才会工作,因为当图像变大时,它就会停止工作(至少当图像大小达到6kB时,它不会工作)。然后,当我看到“已接收”被打印了不止一次。这让我觉得数据被分成了更小的块。但是,即使这些数据块到达服务器(正如我看到从接收到的数据调用的重复打印),图像也已损坏,无法打开
我对协议不太了解,但我认为TCP应该是可靠的,所以数据包以不同的顺序到达的事实不应该发生?所以我想也许Twisted正在做一些我忽略的事情,也许我应该使用另一个协议
这是我的问题。我现在可以做些什么来让它工作,或者我一定要改变到另一个协议?如果是的话……有什么想法吗?我的目标是发送一个更大的图像,可能是数百kB的大小。这是Twisted FAQ中一个条目的变体:
您在
dataReceived
方法中所做的是,在接收到每个区块后,打开一个文件并将该区块的内容写入“image.png”
,然后将其关闭。如果您将其更改为在connectionMade
中打开文件,并在connectionLost
中关闭文件,您至少会模糊地看到正确的行为,但如果连接意外丢失,并且没有任何警告,这仍然会导致图像损坏/截断。你真的应该使用像AMP;虽然如果只是发送大量数据,HTTP可能是更好的选择。您需要分块发送。在接收端保持文件打开,并在每个块到达时写入。它可以以不同大小的块到达。要以块的形式发送,可以使用FileSender协议()FileSender=basic.FileSender()FileSender.beginfilteransfer(data,self.transport)Hey@Glyph,谢谢你的回答。我尝试了connectionMade
-connectionLost
方法,效果很好,不过……我想如果我想要一个可靠的结构,我不应该使用它。我想将此功能与使用TCP协议的更大项目合并,因此如果我可以避免更改所有代码,那就太好了。会像@MartinEvans建议的那样,分块发送,这是一个不错的选择吗?或者这仍然与某种扭曲的内部机制相冲突?再次感谢@josepmeg-听起来你应该问另一个问题-在这里的评论框中填写完整答案会很困难:)。当你问一个新的问题时,一定要准确地填写你的需求是什么以及为什么它们是这样的,因为我不确定我是否完全理解这里的“所有代码”是什么。