
1、了解发送数据的大小,设置接收的大小,这样就可以正好接收所有的数据。黏包问题是由于tcp的优化算法将两个不太大的数据包组合在一起发送的。
这种情况通常发生在连续使用几个send()时。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 这是远程执行cmd命令并返回结果的程序
server端代码
import struct
import socket
sk = socket.socket()
sk.bind(( '127.0.0.1' ,8080))
sk.listen()
conn,addr = sk.accept()
while True:
cmd = input( '>>>' )
conn.send(bytes(cmd,encoding= 'utf-8' ))
num = conn.recv(1024).decode( 'utf-8' ) #接收client端计算好的数据长度
conn.send(bytes( 'ok' ,encoding= 'utf-8' ))
#发送一个确认防止发送num的时候跟后面的send内容合并了
ret = conn.recv(num)
print(ret.decode( 'gbk' ))
conn.close()
sk.close()
|
2、使用struct模块解决粘合现象。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | server端代码
#tcp黏包现象的解决 struct
import struct
import socket
sk = socket.socket()
sk.bind(( '127.0.0.1' ,8080))
sk.listen()
conn,addr = sk.accept()
while True:
cmd = input( '>>>' )
conn.send(bytes(cmd,encoding= 'utf-8' ))
# num = conn.recv(1024).decode('utf-8')
num = conn.recv(1024) #接收数据
num = struct.unpack( 'i' ,num)[0] #进行解包,解包的结果是一个元组类型取第一个数据
# conn.send(bytes('ok',encoding='utf-8'))
ret = conn.recv(num)
print(ret.decode( 'gbk' ))
conn.close()
sk.close()
|
以上就是python解决黏包问题的方法,希望对大家有所帮助。更多Python学习指路:python基础教程
本文教程操作环境:windows7系统、Python 3.9.1,DELL G3电脑。