解决粘包问题简单版本

服务端:

import socket
import time
import subprocess
import struct
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) #可以重复适用系统端口
server.bind(('192.168.43.14', 9907))
server.listen(5)
#第一次

while True:

conn, addr = server.accept()
try:
while True:
cmd = conn.recv(1024)
#if not cmd :break

obj = subprocess.Popen(cmd.decode('utf-8'), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout = obj.stdout.read()
stderr = obj.stderr.read()

#第一步:制作固定长度的报头
total_saze = len(stderr) + len(stdout)
header = struct.pack('i', total_saze)
#第二步:把数据长度发给客户端
conn.send(header)


#第三步:再发送真实数据
conn.send(stdout)
conn.send(stderr)
except ConnectionResetError:
break
conn.close()
server.close()



#客户端和服务端必须遵循有发就得有收的规律






客户端:
import socket
import time
import struct
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('192.168.43.14', 9907))
while True:
cmd = input('请输入你的内容>>>>').strip()
if not cmd: continue
client.send(cmd.encode('utf-8'))
#time.sleep(2)
#client.send('world'.encode('utf-8'))

#第一步:先收报头
header = client.recv(4)

#第二步:从报头中解析出对真实数据的描述(数据的长度)
total_saze = struct.unpack('i', header)[0]

#第三步:接收真实数据
recv_saze = 0
recv_data = b''
while recv_saze < total_saze:
res = client.recv(1024)
recv_data+=res
recv_saze+=len(res)
#data = client.recv(1024)
print(recv_data.decode('GBK'))

原文地址:https://www.cnblogs.com/yuexijun/p/11413435.html