Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Twisted中发送大文件_Python_Image_File_Twisted - Fatal编程技术网

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中一个条目的变体:

TCP是一种基于流的协议。它传递的是一个字节流,可以被分解成任意数量的片段。如果您写入一个大的字节块,它可能会被分解为任意数量的小字节块,具体取决于物理网络连接的特征。当你说TCP应该是“可靠的”,并且数据块应该按顺序到达时,你基本上是正确的:然而,按顺序到达的是字节,而不是数据块


您在
dataReceived
方法中所做的是,在接收到每个区块后,打开一个文件并将该区块的内容写入
“image.png”
,然后将其关闭。如果您将其更改为在
connectionMade
中打开文件,并在
connectionLost
中关闭文件,您至少会模糊地看到正确的行为,但如果连接意外丢失,并且没有任何警告,这仍然会导致图像损坏/截断。你真的应该使用像AMP;虽然如果只是发送大量数据,HTTP可能是更好的选择。

您需要分块发送。在接收端保持文件打开,并在每个块到达时写入。它可以以不同大小的块到达。要以块的形式发送,可以使用FileSender协议()FileSender=basic.FileSender()FileSender.beginfilteransfer(data,self.transport)Hey@Glyph,谢谢你的回答。我尝试了
connectionMade
-
connectionLost
方法,效果很好,不过……我想如果我想要一个可靠的结构,我不应该使用它。我想将此功能与使用TCP协议的更大项目合并,因此如果我可以避免更改所有代码,那就太好了。会像@MartinEvans建议的那样,分块发送,这是一个不错的选择吗?或者这仍然与某种扭曲的内部机制相冲突?再次感谢@josepmeg-听起来你应该问另一个问题-在这里的评论框中填写完整答案会很困难:)。当你问一个新的问题时,一定要准确地填写你的需求是什么以及为什么它们是这样的,因为我不确定我是否完全理解这里的“所有代码”是什么。