zoukankan      html  css  js  c++  java
  • 粘包现象

    粘包

    粘包:主要是指多个包粘在一起,发生此现象的原因,是由于客户端设置的最大接收字节不够。

    粘包的底层原理

    1.运行一个软件跟那几个硬件有关

       cpu 硬盘  内存

    2.启动程序的过程

    • 由硬盘把程序数据加载到内存
    • CPU调用内存中的数据,进行执行
    • 启动一个软件就占一个内存空间,操作系统就得到一个内存空间
    • 操作系统的内存空间 与 软件的内存空间是 互相隔离

    3.send recv 底层原理

    • send操作应用程序的的数据,存放到自己的内存空间里
    • 数据copy给操作系统的内存,操作系统去调用网卡发数据 (速度快)
    • 操作系统会照着tcp协议去发数据
    • recv 通知操作系统,去调网卡收数据 (速度慢)

    站在应用程序角度上:

    • send: 数据发给本地的操作系统 (速度快)
    • recv:  通知操作系统接收数据,内存数据copy到应用程序内存中(速度慢)

    4.recv和send的对比

    4.1: 不管是recv还是send都不是直接接收对方的数据,而是操作自己的操作系统内存--->不是一个send对应一个recv
    一个send可以对应多个recv,一个recv可以对应多个send
    4.2: recv:
    wait data 耗时非常长(原因:传输的过程,网络延迟;客户端没有产生数据)
    copy data 耗时短
    send:
    copy data 耗时短
    4.3:数据量小,间隔短 使用Nagle算法合并成一个包

    服务端

    import socket,time
    '''
    解决粘包的方法
    接收之前明白接收的字节是多少
    '''
    server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    server.bind(('127.0.0.1',9000))
    server.listen(5)
    
    conn,addr=server.accept()
    
    # 第一次接收
    res1=conn.recv(5)
    print('第一次',res1)
    time.sleep(6)
    
    # 第二次接收
    res1=conn.recv(5)
    print('第二次',res1)

    '''

      第一次 b'hello'
      第二次 b'world'

      '''

    客户端

    import socket
    import time
    
    client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    client.connect(('127.0.0.1',9000))
    
    client.send('hello'.encode('utf-8'))
    time.sleep(3)
    client.send('world'.encode('utf-8'))



  • 相关阅读:
    616无趣
    安装elasticsearch的问题
    导出PDF数据
    生活本苦,奈何年华
    分享一个sql查询重复记录
    springboot的java打印票据-4
    springboot的java打印票据-3
    springboot的java打印票据-2
    react 学习笔记
    原生可拖动表格
  • 原文地址:https://www.cnblogs.com/Mryang123/p/8711818.html
Copyright © 2011-2022 走看看