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()

 

posted @ 2020-08-26 08:37  LGQ天  阅读(196)  评论(0)    收藏  举报