簡體   English   中英

在 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 時不起作用)。 然后,當我看到“已接收”被打印不止一次時。 這讓我認為數據被分成更小的塊。 但是,即使這些數據塊到達服務器(因為我看到從 dataReceived 調用的重復打印)圖像已損壞並且無法打開。

我不太了解協議,但我認為 TCP 應該是可靠的,所以數據包以不同的順序到達那里的事實不應該......發生嗎? 所以我在想,也許 Twisted 正在做一些我忽略的事情,也許我應該使用另一個協議。

所以這是我的問題。 我現在可以做些什么來使其工作,或者我絕對應該更改為另一個協議? 如果是這樣......有什么想法嗎? 我的目標是發送更大的圖像,可能是數百 kB 的數量級。

這是 Twisted FAQ 中條目的變體:

TCP 是一種基於流的協議。 它正在傳送一個字節,它可以被分解成任意數量的片段 如果您寫入一大塊字節,它可能會被分解為任意數量的較小塊,具體取決於您的物理網絡連接的特性。 當您說 TCP 應該“可靠”並且塊應該按順序到達時,您大致正確:但是,按順序到達的是bytes ,而不是塊。

您在dataReceived方法中所做的是,在接收到每個塊后,打開一個文件並將該塊的內容寫入"image.png" ,然后關閉它。 如果你改變它來打開該文件connectionMade並關閉文件connectionLost你應該至少看到隱約的正確的行為,雖然這仍然會導致你受到損壞/如果連接意外失去,沒有警告截斷圖像。 你真的應該使用像 AMP 這樣的成幀協議; 盡管如果您只是發送大量數據,HTTP 可能是更好的選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM