22_黏包问题的成因
一、理论回顾
1、黏包的三种成因
(1)当单个数据包较小是接收方可能一次性读取了多个包的数据
(2)当整体数据较大是接收方可能一次仅读取了一个包的一部分内容
(3)TCP协议为了提高效率,会将数据较小且发送间隔较短的数据合并发送,该机制会导致发送方将两个数据包粘在一起发送
二、实操案例
1、代码截图
- 服务器端
- 客户端
2、运行情况
- 客户端
发送消息成功,无回复
- 服务器端
源代码
1、服务器端
# -*- coding:utf-8 -*-
#粘包问题2:接收方的粘包问题
import socket
import time
server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server_socket.bind(('',9099))
server_socket.listen(5)
new_socket,client_addr = server_socket.accept()
print('连接成功',client_addr)
data1 = new_socket.recv(3) #第一次没有接受完整
print("第一个数据包",data1)
time.sleep(6)
data2 = new_socket.recv(10) #第二次会接受旧数据,然后如果还有空间在接受新数据
print("第二个数据包",data2)
new_socket.close()
server_socket.close()
2、客户端
# -*- coding:utf-8 -*-
#接收方可能出现的黏包问题
from socket import *
client_socket = socket(AF_INET,SOCK_STREAM)
client_socket.connect(('192.168.1.13',9099))
client_socket.send('hello'.encode('utf-8'))
client_socket.send('tengtongxue'.encode('utf-8'))
client_socket.close()