一 相关的模块
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()