1、了解发送数据的大小,并设置接收的大小,这样您就可以正确接收所有数据。粘合包的问题是,TCP的优化算法将两个小数据包组合在一起。
这种情况通常发生在连续使用几个send()时。
这是一个远程执行cmd命令并返回结果的程序 server代码 importstruct importsocket sk=socket.socket() sk.bind(('127.0.0.1',8080)) sk.listen() conn,addr=sk.accept() whileTrue: 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内容合并,以防止发送num ret=conn.recv(num) print(ret.decode('gbk')) conn.close() sk.close()
2、使用struct模块来解决粘合现象。
server端代码 #解决structtcp粘包现象 importstruct importsocket sk=socket.socket() sk.bind(('127.0.0.1',8080)) sk.listen() conn,addr=sk.accept() whileTrue: 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电脑。