我有一个非常简单的代码,允许我从客户端向服务器发送图像。它有效。
这很简单:
在客户端......
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的数量级。
答案 0 :(得分:1)
这是Twisted FAQ中条目的变体:
TCP是基于流的协议。它提供字节的流,可以分解为任意数量的片段。如果你写了一大块字节,它可能会分成任意数量的较小块,具体取决于物理网络连接的特性。当你说TCP应该是“可靠的”,并且块应该按顺序到达时,你大致是正确的:然而,按顺序到达的是字节,而不是块。
您在dataReceived
方法中所做的是,在收到每个块后,打开一个文件并将只是那个块的内容写入"image.png"
,然后关闭它。如果您更改它以在connectionMade
中打开文件并关闭connectionLost
中的文件,您至少应该看到正确的行为,尽管这仍然会导致您获得损坏/截断的图像,如果连接是意外丢失,没有任何警告。你应该真的使用像AMP这样的框架协议;虽然如果您只是发送大量数据,HTTP可能是更好的选择。