请问一个 Python Socket 的问题

2021-01-18 16:23:15 +08:00
 deplives

和服务端采用 socket 链接,本地创建一个线程通过 while True: socket.recv(1024) 来接受数据,但是有一次发现,某个数据接受不到,服务端说他确定发了,我也确定我都收了,然后抓了下包发现服务端两次 send 中间只隔了 0.004ms 貌似是因为这个原因导致第二帧数据无法通过 recv() 接收到,请问下这种情况下我该怎么处理

我这个 recv 的线程只有一件事儿,recv 收到数据,然后 push 到一个消费队列,我实际测了一下,我仅仅 recv 就差不多要 4ms 这个到底该怎么玩

1801 次点击
所在节点    Python
11 条回复
Pagliacii
2021-01-18 16:29:59 +08:00
感觉可以把数据存到一个 Buffer 里,满了再做处理
ysc3839
2021-01-18 16:39:25 +08:00
你用的是 TCP 吗? TCP 是流式传输的,没有“帧”的概念。
opengps
2021-01-18 16:40:52 +08:00
找找是不是被拆包过程中抛弃了。抛弃逻辑其实挺多的,不符合协议结构的,粘包的等等
shyrock
2021-01-18 16:44:52 +08:00
发送和接收的代码贴一下。肯定不是发送太快的问题,你这样说多个客户端并发连接就没法搞了。
unixeno
2021-01-18 16:50:00 +08:00
粘包警察警告🐶

你把你收的东西都打印出来估计就知道了
tomemi
2021-01-18 16:53:23 +08:00
TCP 粘包
Jirajine
2021-01-18 16:54:33 +08:00
tcp 不是你这样用的。
你应该写个类,把 tcp 连接包装进去,然后实现一个 read 方法。
内部每次调用 read 时从 tcp 流读数据,读够正好一个对象然后反序列化后返回这个对象。
在外层可以循环调用 read,每次获得一个对象再进行其他处理。
至于其他的优化套个 bufferedreader 之类的就没什么好说的了。
deplives
2021-01-18 17:25:24 +08:00
@unixeno 把日志重新捞了一遍,确实是粘包了,问题已经解决 感谢
nightwitch
2021-01-18 17:30:50 +08:00
tcp 没有帧的概念
todd7zhang
2021-01-18 17:32:40 +08:00
约定发 [length][body], 定死 length 占用几个字节就好了!世上哪有粘包,拆包
Leigg
2021-01-18 22:25:37 +08:00
小伙子不要钓鱼。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/745972

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX