粘包

粘包

  • 发生在发送端的粘包
    • 由于两个数据的发送时间间隔+数据的长度小
    • 所以由tcp协议的优化机制将两条信息作为一条信息发送出去了
    • 为了减少tcp协议中的“确认收到”的网络延迟时间
  • 发生在接收端的粘包
    • 由于tcp协议中所传输的数据无边界,所以来笔记接受的多条数据在接受端的内核的缓存端粘在了一起
  • 本质:接受信息的边界不清晰导致的

粘包问题的解决

  • 自定义写协议1
    • 首先发送报头(与内容无关,为所遵守的协议),报头的长度为4个字节
      • 内容为即将发送的报文的字节长度
      • struct模块
        • pack能够把所有的数字都固定的转换为4个字节
    • 再发送报文
  • 自定义协议2
    • 专门用来做文件发送的协议
    • 先发送报头的字节长度
    • 再发送字典(字典中包含文件的名字、大小。。。)
    • 再发送文件的内容
#client端
import socket
import struct

sk = socket.socket()
sk.connect(("127.0.0.1",9000))
msg =b"hello"
byte_len = struct.pack("i",len(msg)) #将任意数字转化为固定长度的四个字节,i为int类型
sk.send(byte_len )
sk.send(msg)

msg = b"world"
byte_len = struct.pack("i",len(msg))
sk.send(byte_len )
sk.send(msg)


sk.close()

#server端
import socket
import struct
import time

sk = socket.socket()
sk.bind(("127.0.0.1",9000))
sk.listen()

conn,_ = sk.accept()
time.sleep(0.1)
byte_len = conn.recv(4)
size = struct.unpack("i",byte_len)[0]
msg1 = conn.recv(size) #分段量身定制
print(msg1)

byte_len = conn.recv(4)
size = struct.unpack("i",byte_len)[0]
msg2 = conn.recv(size)
print(msg2)


posted @ 2021-06-07 21:35  小杨的冥想课  阅读(41)  评论(0编辑  收藏  举报