gpt4 book ai didi

python - 在 Twisted 中发送大文件

转载 作者:太空宇宙 更新时间:2023-11-03 17:16:22 25 4
gpt4 key购买 nike

我有一个非常简单的代码,允许我将图像从客户端发送到服务器。它有效。

就这么简单:

在客户端...

    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 时不起作用)。然后,当我看到“已收到”被打印不止一次时。这让我认为数据被分成更小的 block 。但是,即使这些数据 block 到达服务器(正如我看到从 dataReceived 调用的重复打印),图像也会损坏并且无法打开。

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

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

最佳答案

这是 Twisted FAQ 中条目的变体:

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

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

关于python - 在 Twisted 中发送大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33639344/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com