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()