服务端:
from socket import * import subprocess import struct server=socket(AF_INET,SOCK_STREAM) server.bind(('127.0.0.1',8080)) server.listen(5) while True: conn,client_addr=server.accept() print('新的客户端',client_addr) while True: try: cmd=conn.recv(1024) #cmd=b'dir' if len(cmd) == 0:break # 运行系统命令 obj=subprocess.Popen(cmd.decode('utf-8'), shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE ) stdout=obj.stdout.read() stderr=obj.stderr.read() #1、先制作报头(固定长度) total_size=len(stdout) + len(stderr) header=struct.pack('i',total_size) #2、先发送固定长度的报头 conn.send(header) #3、再发送真实的数据 conn.send(stdout) conn.send(stderr) except ConnectionResetError: break conn.close() 客户端:
from socket import * import struct client=socket(AF_INET,SOCK_STREAM) client.connect(('127.0.0.1',8080)) while True: cmd=input('>>: ').strip() if len(cmd) == 0:continue client.send(cmd.encode('utf-8')) #1、先收固定长度的报头 header=client.recv(4) #2、从报头中解析出对数据的描述信息 total_size=struct.unpack('i',header)[0] #3、再收真实的数据 recv_size=0 res=b'' while recv_size < total_size : data=client.recv(1024) res+=data recv_size+=len(data) print(res.decode('gbk'))
注意注意注意:
res=subprocess.Popen(cmd.decode('utf-8'),
shell=True,stderr=subprocess.PIPE,stdout=subprocess.PIPE)的结果的编码是以当前所在的系统为准的,如果是windows,那么res.stdout.read()读出的就是GBK编码的,在接收端需要用GBK解码
且只能从管道里读一次结果