python3中,使用scoket模块和subprocess编写一个简单的数据传输模块:客户端发送一个Windows下的终端命令,服务端使用subprocess模块执行这个命令并返回执行结构给客户端。编写完成之后使用其他命令都可以正常执行,但就是使用ipconfig/all这个命令会一直卡在那,不报错也不执行,这是怎么回事?
server.py
import socket import subprocess import struct
server = socket.socket()
IP = str(input("请输入你的IP:"))
port = int(input("请输入你的端口:"))
server.bind(('127.0.0.1',1234)) server.listen(5)
while 1: print("server is working...") conn,addr = server.accept()
while 1:
try:
cmd = conn.recv(1024).decode("utf8") # 获取到客户端发来的命令
print("cmd = ",cmd)
if cmd == b"exit":
print("断开连接...")
break
res = subprocess.Popen(cmd,
shell=True,
stderr=subprocess.PIPE,
stdout=subprocess.PIPE,
)
print("*******")
err = res.stderr.read() # 读取错误
stu = res.stdout.read() # 读取正确信息
print("响应长度:",len(stu))
print("错误长度:",len(err))
if err:
# 构建报头
header_pack = struct.pack("i", len(err))
# 发送报头
conn.send(header_pack) # 将正确获取到的信息返回给客户端
# 发送数据
conn.send(err) # 将错误信息返回给客户端
else:
# 构建报头
header_pack = struct.pack("i",len(stu))
# 发送报头
conn.send(header_pack) # 将正确获取到的信息返回给客户端
# 发送数据
conn.send(stu)
break
except Exception as e:
break
conn.close()
client.py
import socket import struct client = socket.socket()
IP = str(input("请输入你的IP:"))
port = int(input("请输入你的端口:"))
client.connect(('127.0.0.1',1234))
while 1: print("clien is working...")
# 发送命令
cmd = input("请输入命令:")
client.send(cmd.encode("gbk"))
if cmd == "":
continue
if cmd == "exit":
break
# 先接收4个字节,获取数据长度
header_pack = client.recv(4)
data_length = struct.unpack("i",header_pack)[0] # 获取到数据长度的值:例如1200字节
print("data_length = ",data_length)
recv_data_length = 0 # 剩余数据长度
recv_data = b"" # 获取到的数据
while recv_data_length < data_length:
# 由于是现接受了4个字节,所以之后再次接受后面的数据就可以按照数据的长度来接收:每次都接收1024字节的数据
data = client.recv(1024)
recv_data_length = recv_data_length + len(data)
recv_data = recv_data + data
# 接收命令执行返回值
response = recv_data.decode("gbk")
print(response)
client.close()