和服务端采用 socket 链接,本地创建一个线程通过 while True: socket.recv(1024)
来接受数据,但是有一次发现,某个数据接受不到,服务端说他确定发了,我也确定我都收了,然后抓了下包发现服务端两次 send 中间只隔了 0.004ms 貌似是因为这个原因导致第二帧数据无法通过 recv()
接收到,请问下这种情况下我该怎么处理
我这个 recv 的线程只有一件事儿,recv 收到数据,然后 push 到一个消费队列,我实际测了一下,我仅仅 recv 就差不多要 4ms 这个到底该怎么玩
1
Pagliacii 2021-01-18 16:29:59 +08:00
感觉可以把数据存到一个 Buffer 里,满了再做处理
|
2
ysc3839 2021-01-18 16:39:25 +08:00 via Android
你用的是 TCP 吗? TCP 是流式传输的,没有“帧”的概念。
|
3
opengps 2021-01-18 16:40:52 +08:00
找找是不是被拆包过程中抛弃了。抛弃逻辑其实挺多的,不符合协议结构的,粘包的等等
|
4
shyrock 2021-01-18 16:44:52 +08:00
发送和接收的代码贴一下。肯定不是发送太快的问题,你这样说多个客户端并发连接就没法搞了。
|
5
unixeno 2021-01-18 16:50:00 +08:00 via Android 1
粘包警察警告🐶
你把你收的东西都打印出来估计就知道了 |
6
tomemi 2021-01-18 16:53:23 +08:00
TCP 粘包
|
7
Jirajine 2021-01-18 16:54:33 +08:00 via Android
tcp 不是你这样用的。
你应该写个类,把 tcp 连接包装进去,然后实现一个 read 方法。 内部每次调用 read 时从 tcp 流读数据,读够正好一个对象然后反序列化后返回这个对象。 在外层可以循环调用 read,每次获得一个对象再进行其他处理。 至于其他的优化套个 bufferedreader 之类的就没什么好说的了。 |
9
nightwitch 2021-01-18 17:30:50 +08:00
tcp 没有帧的概念
|
10
todd7zhang 2021-01-18 17:32:40 +08:00
约定发 [length][body], 定死 length 占用几个字节就好了!世上哪有粘包,拆包
|
11
Leigg 2021-01-18 22:25:37 +08:00 via iPhone 1
小伙子不要钓鱼。
|