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

    tcp的粘包现象:发送的多条消息在发送到接收的过程中可能会粘在一起

        只出现在tcp协议中,因为tcp协议 多条消息之间没有边界,并且还有大量优化算法

    发送端:两条消息很短;发送时间间隔也非常短

    接收端:多条消息没有及时接收,而堆积在接收方缓存堆里

    如何解决:
      发送方:
        1.计算即将要发送的数据的长度,通过struct模块将长度转换成固定的4个字节的bytes数据
        2.先发送这固定4个字节的bytes数据
        3.再发送指定要发送的数据

      接收方:
        1.len = recv(4) 接收固定4个字节的bytes数据
        2.len = 通过struct模块将接收到的bytes数据转换回原来的数据的长度
        3.recv(len) 再接收相应长度的数据

    server端代码示例:

    import socket
    import struct
    
    
    sk = socket.socket()
    sk.bind(('ip', port))
    sk.listen()
    
    conn, addr = sk.accept()
    
    send_msg1 = input('>>>').encode('utf-8')
    send_msg2 = input('>>>').encode('utf-8')
    
    blen1 = struct.pack('i', len(send_msg1))
    conn.send(blen1)
    conn.send(send_msg1)
    
    blen2 = struct.pack('i', len(send_msg2))
    conn.send(blen2)
    conn.send(send_msg2)
    
    recv_msg = conn.recv(1024)
    print(recv_msg)
    
    conn.close()
    
    sk.close()

    client端代码示例:

    import socket
    import struct
    
    
    sk = socket.socket()
    
    sk.connect(('10.11.30.149', 9001))
    
    blen1 = sk.recv(4)
    blen1 = struct.unpack('i', blen1)[0]
    recv_msg1 = sk.recv(blen1).decode('utf-8')
    print(recv_msg1)
    
    blen2 = sk.recv(4)
    blen2 = struct.unpack('i', blen2)[0]
    recv_msg2 = sk.recv(blen2).decode('utf-8')
    print(recv_msg2)
    
    sk.send(b'hello')
    
    sk.close()
  • 相关阅读:
    树的基本概念
    bean的生命周期
    bean的创建过程--doCreateBean
    bean的创建过程--doGetBean
    SpringBoot自动装配解析
    [论文理解] Good Semi-supervised Learning That Requires a Bad GAN
    Ubuntu 环境安装 opencv 3.2 步骤和问题记录
    Linux 环境使用 lsof 命令查询端口占用
    Ubuntu 安装不同版本的 gcc/g++ 编译器
    [持续更新] 安全能力成长计划
  • 原文地址:https://www.cnblogs.com/GOD-L/p/13563068.html
Copyright © 2011-2022 走看看