V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
deplives
V2EX  ›  Python

请问一个 Python Socket 的问题

  •  
  •   deplives · 2021-01-18 16:23:15 +08:00 · 1784 次点击
    这是一个创建于 1411 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    你把你收的东西都打印出来估计就知道了
    tomemi
        6
    tomemi  
       2021-01-18 16:53:23 +08:00
    TCP 粘包
    Jirajine
        7
    Jirajine  
       2021-01-18 16:54:33 +08:00 via Android
    tcp 不是你这样用的。
    你应该写个类,把 tcp 连接包装进去,然后实现一个 read 方法。
    内部每次调用 read 时从 tcp 流读数据,读够正好一个对象然后反序列化后返回这个对象。
    在外层可以循环调用 read,每次获得一个对象再进行其他处理。
    至于其他的优化套个 bufferedreader 之类的就没什么好说的了。
    deplives
        8
    deplives  
    OP
       2021-01-18 17:25:24 +08:00
    @unixeno 把日志重新捞了一遍,确实是粘包了,问题已经解决 感谢
    nightwitch
        9
    nightwitch  
       2021-01-18 17:30:50 +08:00
    tcp 没有帧的概念
    todd7zhang
        10
    todd7zhang  
       2021-01-18 17:32:40 +08:00
    约定发 [length][body], 定死 length 占用几个字节就好了!世上哪有粘包,拆包
    Leigg
        11
    Leigg  
       2021-01-18 22:25:37 +08:00 via iPhone   ❤️ 1
    小伙子不要钓鱼。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2863 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 12:40 · PVG 20:40 · LAX 04:40 · JFK 07:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.