服务端
from socket import *
import subprocess
import struct
tcp_server=socket(AF_INET,SOCK_STREAM)
tcp_server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
tcp_server.bind(('127.0.0.1',8000))
tcp_server.listen(5)
while True:
conn,addr=tcp_server.accept()
print(addr)
while True:
try:
data_cmd = conn.recv(1024)
if not data_cmd:break
print('收到客户端的命令')
res = subprocess.Popen(data_cmd.decode('utf-8'), shell=True,stderr=subprocess.PIPE,\
stdout=subprocess.PIPE,stdin=subprocess.PIPE)
err = res.stderr.read()
if err:
res_data=err
else:
res_data=res.stdout.read()
if not res_data:
res_data = '执行成功'.encode('gbk')
length = len(res_data)
data_length = struct.pack('i', length)
conn.send(data_length)
conn.send(res_data)
except Exception as e:
print(e)
break
客户端
from socket import *
import subprocess
import struct
buff_size=1024
tcp_client=socket(AF_INET,SOCK_STREAM)
tcp_client.connect(('127.0.0.1',8000))
while True:
cmd_data=input('请输入命令:')
if not cmd_data:continue
if cmd_data == 'quit': break
tcp_client.send(cmd_data.encode('utf-8'))
length_data = tcp_client.recv(4)
head_data=struct.unpack('i',length_data)[0]
res_length=0
res_msg=b''
while res_length < head_data:
res_msg += tcp_client.recv(buff_size)
res_length += len(res_msg)
print(res_length)
print('命令的执行结果是 ', res_msg.decode('gbk'))
tcp_client.close()
输出结果:
('127.0.0.1', 63745)
收到客户端的命令 dir
请输入命令:dir
903
命令的执行结果是 驱动器 D 中的卷是 软件
卷的序列号是 65F3-3762
D:\python\study\socket01 的目录
2020/03/10 18:57 <DIR> .
2020/03/10 18:57 <DIR> ..
2020/03/08 19:55 231 client.py
2020/03/10 18:57 1,067 cmd_client_tcp.py
2020/03/10 18:57 2,290 cmd_server_tcp.py
2020/03/09 15:54 333 ntp-client.py
2020/03/09 16:25 468 ntp-server.py
2020/03/08 19:54 315 server.py
2020/03/09 15:54 333 udp-client.py
2020/03/09 15:54 320 udp-server.py
2020/03/08 19:34 0 __init__.py
2020/03/08 22:34 443 客户端.py
2020/03/08 22:33 445 客户端11.py
2020/03/08 22:33 720 服务端.py
2020/03/10 17:12 <DIR> 练习
12 个文件 6,965 字节
3 个目录 76,889,382,912 可用字节