[問題] Socket 傳送大資料時會與後續資料串起來

看板Python作者 (酒虎)時間3年前 (2021/03/26 16:24), 編輯推噓5(506)
留言11則, 3人參與, 3年前最新討論串1/1
小弟先前寫了幾個小程式, 主要透過 socket 來達成連線和資料的傳輸。 在當時就有遭遇如同標題的問題, 例如說從 server 這一方發送:  conn.sendall('執行 A'.encode('utf-8'))  conn.sendall('執行 B'.encode('utf-8')) 連續發送數個資料時, client 方就很容易接收成:  執行 A執行 B 這樣子期望上要分開卻串在一起情形。 後來的做法是在發送時加上固定的字尾作為辨識, 例如小弟加了 DataEnd, 因此上面的例子中, client 方會接收成:  執行 ADataEnd  執行 BDataEnd 當然偶爾還是會串在一起變成「執行 ADataEnd執行 BDataEnd」, 但因為有辨識用的字尾在裡面, 使用 find 這類函數就可以把接收到的資料切開處理。 這一次的問題則是起於我想要傳送一個較大的資料, 3 分鐘左右的影片、圖片或文件檔都好。 上述的解決辦法雖然能解決串起來的問題, 但當接收的資料較大時, 每次 client 執行 recv 完, 就得跑一次 find, 變得 30 MB 的檔案在 client 端要花上好幾十分鐘才能接收完。 一開始想說會不會是網路的問題, 但把 client 的程式碼大多都拔掉到只剩下接收功能時, 不到一分鐘就能把同樣的檔案接收完成。 因此, 想來這裡向各位前輩請教, 該如何解決這樣的窘境? 目前暫時的解決法是藉由 thread 設置了兩組 server 與 client:  第一組 server 與 client 只負責傳送簡短的資料或命令  第二組 server 與 client 只負責傳送較大檔案的資料 並在第二組 server 每次 sendall 後加入 10 秒的 sleep, 避免與下一個檔案串在一起。 先謝謝各位前輩閱覽此問了。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 110.30.2.5 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1616747082.A.390.html

03/26 21:52, 3年前 , 1F
tcp會幫你合併或分割,一個做法是加上header寫長度
03/26 21:52, 1F

03/27 00:20, 3年前 , 2F
header裡面放後面payload的長度,當buffer收到足夠
03/27 00:20, 2F

03/27 00:21, 3年前 , 3F
長的rawdata,就切割/解碼一次,然後buffer清舊資料
03/27 00:21, 3F

03/27 00:21, 3年前 , 4F
再繼續下個循環,如此反覆操作
03/27 00:21, 4F

03/27 00:39, 3年前 , 5F
一個小例子:
03/27 00:39, 5F

03/27 00:39, 3年前 , 6F
03/27 00:39, 6F

03/27 00:39, 3年前 , 7F
03/27 00:39, 7F

03/27 00:42, 3年前 , 8F

03/27 13:43, 3年前 , 9F
就像一樓說的那樣,關鍵字:tcp sticky packet
03/27 13:43, 9F

03/28 12:44, 3年前 , 10F
謝謝各位提供的資料和關鍵字!
03/28 12:44, 10F

03/29 00:20, 3年前 , 11F
不客氣~
03/29 00:20, 11F
文章代碼(AID): #1WNPfAEG (Python)
文章代碼(AID): #1WNPfAEG (Python)