[爆卦]python socket多人連線是什麼?優點缺點精華區懶人包

為什麼這篇python socket多人連線鄉民發文收入到精華區:因為在python socket多人連線這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者jakeasa123 (酒虎)看板Python標題[問題] Socket 傳送大資料時會與後續資...


小弟先前寫了幾個小程式,
主要透過 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

你可能也想看看

搜尋相關網站