python-19-subprocess-tcp实现执行命令

322 阅读1分钟

subprocess

import subprocess
res = subprocess.Popen('dir',shell=True,stdout=subprocess.PIPE,stdin=subprocess.PIPE,stderr=subprocess.PIPE)
print(res.stdout.read())

tcp 实现执行命令

socket_server_tcp

from socket import *
import subprocess
ip_port = ('127.0.0.1',8080)
back_log=5
buffer_size = 1024

tcp_server = socket(AF_INET,SOCK_STREAM)

tcp_server.bind(ip_port)
tcp_server.listen(back_log)

while True:
    conn,addr = tcp_server.accept()
    print('新的客户端链接',addr)
    while True:
        try:
            cmd=conn.recv(buffer_size)
            if not cmd:break#结束整个循环
            print('收到的客户端的命令',cmd)

            res = subprocess.Popen(cmd.decode('utf-8'), shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE)
            err = res.stderr.read()
            if err:
                cmd_res = err
            else:
                cmd_res = res.stdout.read()

            if not cmd_res:
                cmd_res='success'.encode('gbk')
            conn.send(cmd_res)
        except Exception as e:
            print(e)
            break
   

tocket_client_tcp

from socket import *
ip_port = ('127.0.0.1',8080)
back_log=5
buffer_size=1024

tcp_client = socket(AF_INET,SOCK_STREAM)
tcp_client.connect(ip_port)

while True:
        cmd = input('>>:').strip()
        if not cmd:continue#跳出当前循环,进入下一个循环
        if cmd == 'quit':break
        tcp_client.send(cmd.encode('utf-8'))
        cmd_res = tcp_client.recv(buffer_size)
        print('命令的执行结果是',cmd_res.decode('gbk'))
tcp_client.close()
#tcp会存在粘包现象,其他协议不会存在

#tcp服务端和客户端是成套的,单独运行会出现问题,这样能够保证数据不丢失,而udp服务端和客户端是可以单独运行的
#udp只管发消息,不管有没有人接收消息,所以说发出的消息可能会丢失。

#粘包产生的两种方式:一是发送多次每次发送的字节很小,二是一次发送的太大,导致无法接收完全。