在Twisted中发送大文件

时间:2015-11-10 20:49:35

标签: 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("image.png",'wb')
        f.write(data)
        f.close()

问题是只有当图像达到4.somethingkB时才有效,因为它在图像较大时停止工作(至少在达到6kB时不起作用)。然后,当我看到"收到"正在印刷不止一次。这让我觉得数据是以较小的块分开的。但是,即使这些数据块进入服务器(因为我看到从dataReceived调用的重复打印),图像已损坏,无法打开。

我不太了解协议,但我认为TCP应该是可靠的,因此数据包以不同的顺序到达那里的事实不应该发生吗?所以我在想,也许Twisted正在那里做一些我忽略的事情,也许我应该使用另一个协议。

所以这是我的问题。我现在可以做些什么来使它工作,或者我肯定应该改为另一个协议?如果是这样......任何想法?我的目标是发送一个更大的图像,可能是几百kB的数量级。

1 个答案:

答案 0 :(得分:1)

这是Twisted FAQ中条目的变体:

TCP是基于流的协议。它提供字节,可以分解为任意数量的片段。如果你写了一大块字节,它可能会分成任意数量的较小块,具体取决于物理网络连接的特性。当你说TCP应该是“可靠的”,并且块应该按顺序到达时,你大致是正确的:然而,按顺序到达的是字节,而不是块。

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