粘包现象是指发送方发送的若干数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。粘包现象只会在tcp中出现,udp中不会有,因为udp是基于包来传输信息的,就一个sendto()对应另一个recvfrom()
tcp粘包
第一种粘包
发送端需要等缓冲区满才发送出去,造成粘包(发送数据时间间隔很短,数据也很小,会合到一起发送,产生粘包)
服务端测试代码:
from socket import *
import subprocess
ip_port=('192.168.43.247',8080) #记录ip地址
back_log = 5 #端口数为5
buffer_size = 1024 #表示可以发送消息的大小为1024字节
tcp_server= socket(AF_INET,SOCK_STREAM) #建立socket对象
tcp_server.bind(ip_port) #绑定ip地址
tcp_server.listen(back_log) #监听端口
conn, addr= tcp_server.accept() #获取客户端链接
#第一种粘包,能收的量太大了
#会出现第一种粘包现象,因为可以收的数据远大于真实传来的数据,
#tcp内的优化算法会把几个短的数据合成一个数据来发送
#接收消息
data1 = conn.recv(buffer_size) #都能收1024字节
print('第一个消息:',data1.decode('utf-8'))
data2 = conn.recv(buffer_size)
print('第二个消息:',data2.decode('utf-8'))
data3 = conn.recv(buffer_size)
print('第三个消息:',data3.decode('utf-8'))
conn.close() #关闭链接
客户端测试代码:
可以看到是一个简单的发送3条消息
from socket import *
import subprocess
ip_port=('192.168.43.247',8080) #记录ip地址
back_log = 5 #端口数为5