解决粘包代码 ,接收数据时按照自定义头部大小来接收 (subprocess模块的getoutput方法返回str有长度限制 ,所以还是使用实例化Popen完成获取标准输出标准错误)
import socket
import struct
import subprocess
server1 = socket.socket()
server1.bind(('127.0.0.1', 8080))
server1.listen(5)
while 1:
conn, addr = server1.accept()
while 1:
try:
client_date = conn.recv(1024)
obj = subprocess.Popen(client_date.decode('utf-8'),
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
ret = obj.stdout.read() # gbk编码的byte类型
ret1 = obj.stderr.read() # gbk编码的byte类型
date_size = len(ret1 + ret) # 把标准错误与标准输出全部传给客户端
print(date_size)
head = struct.pack('i', date_size) # 将数据长度压缩为4字节byte
conn.send(head)
conn.send(ret + ret1)
except:
break
conn.close()
server1.close()
################################################################################
import socket
import struct
C1 = socket.socket()
C1.connect(('127.0.0.1', 8080))
while 1:
cmd1 = input('CMD:')
C1.send(cmd1.strip().encode('gbk'))
if cmd1 == 'bye':
break
S_data_size = struct.unpack('i', C1.recv(4))[0] # 总数据大小
already_size = 0 # 已经接收数据大小
S_data = b'' # 接受数据byte拼接
if S_data_size < 1024:
S_data = C1.recv(1024)
else:
while already_size < S_data_size:
now_data = C1.recv(1024)
S_data = S_data + now_data
already_size += len(now_data)
print()
print(S_data.decode('gbk'))
C1.close()