在 Twisted 中发送大文件
Sending big files in 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 时不起作用)。然后,当我看到 "Received" 被多次打印时。这让我觉得数据被分成更小的块。但是,即使这些数据块到达服务器(正如我看到从 dataReceived 调用的重复打印)图像已损坏且无法打开。
我不太了解协议,但我认为 TCP 应该是可靠的,所以数据包以不同的顺序到达那里的事实不应该……发生吗?所以我在想,也许 Twisted 正在做一些我忽略的事情,也许我应该使用另一个协议。
所以这是我的问题。我现在可以做些什么来让它发挥作用,还是我一定要换成另一个协议?如果是这样......有什么想法吗?我的目标是发送更大的图像,可能是数百 kB 的数量级。
这是 Twisted FAQ 中条目的变体:
TCP 是一种基于流的 协议。它正在传送 字节 的 流 ,它可以被分解成任意数量的 片段 。如果您写入一大块字节,它可能会被分解成任意数量的小块,具体取决于您的物理网络连接的特性。当您说 TCP 应该是 "reliable",并且块应该按顺序到达时,您大致是正确的:但是,按顺序到达的是 字节 ,而不是块.
您在 dataReceived
方法中所做的是,在收到每个块后,打开一个文件并将 的内容写入 到 "image.png"
,然后关闭它。如果您将其更改为在 connectionMade
中打开文件并在 connectionLost
中关闭文件,您至少应该看到模糊的正确行为,尽管如果连接是这样,这仍然会导致您损坏/截断图像意外丢失,没有任何警告。你真的应该使用像 AMP 这样的框架协议;尽管如果您只是发送大量数据,HTTP 可能是更好的选择。
我有一个非常简单的代码,可以让我从客户端向服务器发送图像。它有效。
就这么简单:
在客户端...
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 时不起作用)。然后,当我看到 "Received" 被多次打印时。这让我觉得数据被分成更小的块。但是,即使这些数据块到达服务器(正如我看到从 dataReceived 调用的重复打印)图像已损坏且无法打开。
我不太了解协议,但我认为 TCP 应该是可靠的,所以数据包以不同的顺序到达那里的事实不应该……发生吗?所以我在想,也许 Twisted 正在做一些我忽略的事情,也许我应该使用另一个协议。
所以这是我的问题。我现在可以做些什么来让它发挥作用,还是我一定要换成另一个协议?如果是这样......有什么想法吗?我的目标是发送更大的图像,可能是数百 kB 的数量级。
这是 Twisted FAQ 中条目的变体:
TCP 是一种基于流的 协议。它正在传送 字节 的 流 ,它可以被分解成任意数量的 片段 。如果您写入一大块字节,它可能会被分解成任意数量的小块,具体取决于您的物理网络连接的特性。当您说 TCP 应该是 "reliable",并且块应该按顺序到达时,您大致是正确的:但是,按顺序到达的是 字节 ,而不是块.
您在 dataReceived
方法中所做的是,在收到每个块后,打开一个文件并将 的内容写入 到 "image.png"
,然后关闭它。如果您将其更改为在 connectionMade
中打开文件并在 connectionLost
中关闭文件,您至少应该看到模糊的正确行为,尽管如果连接是这样,这仍然会导致您损坏/截断图像意外丢失,没有任何警告。你真的应该使用像 AMP 这样的框架协议;尽管如果您只是发送大量数据,HTTP 可能是更好的选择。