服务端:
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- import socket
- import subprocess
- import struct
- import JSON
- phone = 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 socket
- import struct
- import JSON
- phone1 = 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-8
- phone1.close()
来源: http://www.bubuko.com/infodetail-3167993.html