服务端:
#!/usr/bin/env python# -*- coding: utf-8 -*-import socketimport subprocessimport structimport jsonphone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)phone.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1) # 端口复用phone.bind(('127.0.0.1', 8090))phone.listen(10)while True: # 连接循环 connt , client = phone.accept() print('starting ....') print(client) while True: # 通信循环 try: # 1.收到命令: cmd = connt.recv(1024) if not cmd :continue # 适用于Linux 操作系统 # 2.执行命令: ojb = subprocess.Popen(cmd.decode('utf-8'),shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE) stdout = ojb.stdout.read() stderr = ojb.stderr.read() # 3.返回命令结果给客户端: # 第一步先制作报头 header_dic = { 'filename':'aaa.txt', 'md5':'adv88889992', 'total_size': len(stderr+stdout) } # 第二步 序列号header_dic header_json = json.dumps(header_dic) header_bytes = header_json.encode('utf-8') # 第三步 先发送包头的长度 res = len(header_bytes) connt.send(struct.pack('i', res)) # 第四步 再发送报头 connt.send(header_bytes) # 第五步再发送真实数据 connt.send(stdout) connt.send(stderr) except ConnectionResetError: # 适用于windows操作系统 break connt.close()phone.close()
客户端:
#!/usr/bin/env python# -*- coding: utf-8 -*-import socketimport structimport jsonphone1 = socket.socket(socket.AF_INET,socket.SOCK_STREAM)phone1.connect(('127.0.0.1',8090))while True: # 1.发命令 cmd = input('>>>:').strip() if not cmd:continue phone1.send(cmd.encode('utf-8')) # 2.拿到命令并打印结果 # 第一步先收报头长度 obj=phone1.recv(4) # 第二步从包头中解析出对真实数据的描述信息 header_size=struct.unpack('i',obj)[0] # 第三步接收报头 header_bytes= phone1.recv(header_size) # 第 四步反序列化: header_json = header_bytes.decode('utf-8') header_dic = json.loads(header_json) total_size = header_dic['total_size'] # 第五步 接收真实数据 recv_size = 0 data_size = b'' while recv_size < total_size: data =phone1.recv(1024) data_size += data recv_size += len(data) print(data_size.decode('gbk')) # windows 默认编码是gbk linux 默认编码是 utf-8phone1.close()