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()
  • 相关阅读:
    html5 file 上传文件
    JavaScript数组去重—ES6的两种方式
    音频资源下载
    whistle工具全程入门
    解构赋值
    节流(Throttling)和去抖(Debouncing)详解
    HTML5实现全屏
    Vue.js 子组件的异步加载及其生命周期控制
    6个Async/Await完胜Promise的原因
    Docker容器学习与分享08
  • 原文地址:https://www.cnblogs.com/GOD-L/p/13563068.html
Copyright © 2011-2022 走看看