sever
import struct # 把有限长度的数字变成4个字节
import subprocess # 引入子进程模块
import socket
sever = socket.socket()
sever.bind((‘192.168.3.7’, 9000))
sever.listen(5)
while 1:
print(‘sever working 开始等待链接’)
conn, addr = sever.accept()
while 1:
try:
data = conn.recv(1024)
res = subprocess.Popen(data.decode(‘utf-8’), # 创建子进程对象 第一个参数是操作系统命令string类型
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
err = res.stderr.read() # 操作系统命令标准错误 返回的字符串
out = res.stdout.read() # 操作系统命令标准输出 返回的字符串
if err:
conn.send(struct.pack(‘i’, len(err)))
conn.send(err)
break
else:
conn.send(struct.pack(‘i’, len(out)))
conn.send(out)
break
except ConnectionResetError as e:
break
conn.close()
client
import socket
import struct # 结构模块,可以把integer类型的数据压缩成4个字节,用于接受文件的报头(数据传输长度)
while 1:
client = socket.socket()
client.connect((‘192.168.3.7’, 9000))
user_iniput = input()
client.send(user_iniput.encode(‘utf-8’))
data = client.recv(4) # 固定接受4个字节
# print(data)
head_pack = struct.unpack(‘i’, data) # head_pack = 接受到的报头字节类型转换成integer类型
main_data = ‘’.encode(‘utf-8’) # 之后准备接收数据 设定为空
while len(main_data) < head_pack[0]: # head_pack 返回的是元组(integer, ) 当总数据长度小于报头长度
data1 = client.recv(1024) # 反复接收1024字节数据
main_data += data1 # 接收来的数据累加
print(main_data.decode(‘gbk’))
client.close()