看板 Python 關於我們 聯絡資訊
小弟先前寫了幾個小程式, 主要透過 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
james732: tcp會幫你合併或分割,一個做法是加上header寫長度 03/26 21:52
cuteSquirrel: header裡面放後面payload的長度,當buffer收到足夠 03/27 00:20
cuteSquirrel: 長的rawdata,就切割/解碼一次,然後buffer清舊資料 03/27 00:21
cuteSquirrel: 再繼續下個循環,如此反覆操作 03/27 00:21
cuteSquirrel: 一個小例子: 03/27 00:39
cuteSquirrel: server: https://pastebin.com/wRxgBigR 03/27 00:39
cuteSquirrel: client: https://pastebin.com/BycG0ZDT 03/27 00:39
cuteSquirrel: https://i.imgur.com/px9Io12.png 03/27 00:42
cuteSquirrel: 就像一樓說的那樣,關鍵字:tcp sticky packet 03/27 13:43
jakeasa123: 謝謝各位提供的資料和關鍵字! 03/28 12:44
cuteSquirrel: 不客氣~ 03/29 00:20