作者jakeasa123 (酒虎)
看板Python
标题[问题] Socket 传送大资料时会与後续资料串起来
时间Fri Mar 26 16:24:38 2021
小弟先前写了几个小程式,
主要透过 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://webptt.com/cn.aspx?n=bbs/Python/M.1616747082.A.390.html
1F:→ james732: tcp会帮你合并或分割,一个做法是加上header写长度 03/26 21:52
2F:推 cuteSquirrel: header里面放後面payload的长度,当buffer收到足够 03/27 00:20
3F:→ cuteSquirrel: 长的rawdata,就切割/解码一次,然後buffer清旧资料 03/27 00:21
4F:→ cuteSquirrel: 再继续下个循环,如此反覆操作 03/27 00:21
5F:推 cuteSquirrel: 一个小例子: 03/27 00:39
9F:推 cuteSquirrel: 就像一楼说的那样,关键字:tcp sticky packet 03/27 13:43
10F:→ jakeasa123: 谢谢各位提供的资料和关键字! 03/28 12:44
11F:推 cuteSquirrel: 不客气~ 03/29 00:20