一 相关的模块
1 subprocess模块:执行系统模块
subprocess.Popen():调用当前系统来执行命令。
stdout:标准正确的输出
stderr:错误的输出
stdin:输入
shell=True:系统解释器
subprocess.PIPE:就是一个管道
2 struct模块
struct.pack:打包成一个bates类型
struct.unpack:解包,解包一个bates的类型
struct的一些方法:
详细网站:http://www.cnblogs.com/coser/archive/2011/12/17/2291160.html
实例一:
服务端:
import socket import subprocess import struct phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) phone.bind(('127.0.0.1',8080)) phone.listen(10) while True: conn,addr=phone.accept() print(addr[0:2]) while True: try: msg=conn.recv(1024).decode('utf-8') obj=subprocess.Popen(msg,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE) stdout=obj.stdout.read() stderr=obj.stderr.read() tes=struct.pack('i',len(stdout)+len(stderr)) conn.send(tes) conn.send(stdout) conn.send(stderr) except Exception: break conn.close() phone.close()
客户端:
import socket import struct phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) phone.connect(('127.0.0.1',8080)) while True: msg=input('>>>:').strip() phone.send(msg.encode('utf-8')) if not msg:continue tes=phone.recv(4) tes_size=struct.unpack('i',tes)[0] print(tes_size) msg_data_1=b'' data_size=0 while data_size<tes_size: msg_data=phone.recv(1024) msg_data_1+=msg_data data_size+=len(msg_data) print(msg_data_1.decode('gbk')) phone.close()
实例二:
服务端:
import socket import subprocess import struct import json phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) phone.bind(('127.0.0.1',8080)) phone.listen(10) while True: conn,addr=phone.accept() print(addr[0:2]) while True: try: msg=conn.recv(1024).decode('utf-8') obj=subprocess.Popen(msg,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE) stdout=obj.stdout.read() stderr=obj.stderr.read() ret_dic={'filename':'a.txt','filesize':len(stdout)+len(stderr)} #设定报头 ret_bytes=json.dumps(ret_dic).encode('utf-8') #首先转成字符传类型,再转成bytes类型 conn.send(struct.pack('i',len(ret_bytes))) #发送转成bytes类型后打包的固定字节长度 conn.send(ret_bytes) #发送转成后的bytes类型 conn.send(stdout) conn.send(stderr) except Exception: break conn.close() phone.close()
客户端:
import socket import struct import json phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) phone.connect(('127.0.0.1',8080)) while True: msg=input('>>>:').strip() phone.send(msg.encode('utf-8')) if not msg:continue ret_size=struct.unpack('i',phone.recv(4))[0] #接收报头的长度 tes_size=json.loads(phone.recv(ret_size).decode('utf-8'))['filesize'] #接收报头并转成字典类型并提取接收数据的长度 msg_data_1=b'' #设置一个接收数据bytes类型为空 data_size=0 #设置一个接收数据的大小为0 while data_size<tes_size: #循环条件 msg_data=phone.recv(1024) #接收数据的大小 msg_data_1+=msg_data #添加数据到设置的空的数据里 data_size+=len(msg_data) #接收数据的大小自加每次接收的大小 print(msg_data_1.decode('gbk'),tes_size) phone.close()