远程执行命令,补充subprocess模块,粘包现象及解决办法

远程执行命令,补充subprocess模块,粘包现象及解决办法
1.subprocess模块
    shell参数:
    如果把shell设置成True,指定的命令会在shell里解释执行。
    subprocess.PIPE
    一个可以被用于Popen的stdin 、stdout 和stderr 3个参数的特输值,表示需要创建一个新的管道。
    例:
    #author: wylkjj
    #date:2019/4/18
    import subprocess
    # b=subprocess.Popen('dir',shell=True)
    # print(b)
    #stdout=subprocess.PIPE把子进程封装到a里面去了
    a=subprocess.Popen('dir',shell=True,stdout=subprocess.PIPE)
    # print(a)#多进程,子进程,父进程同时进行,谁快谁先打印
    print(str(a.stdout.read(),'gbk'))#把执行结果从子进程里面取出来
2.远程执行命令
    #author: wylkjj
    #date:2019/4/18
    #服务端
    import subprocess
    import socket
    sk=socket.socket()
    address=('127.0.0.1',8000)
    sk.bind(address)
    sk.listen(2)
    print('waiting')
    while 1:
        conn,addr=sk.accept()
        print(addr)
        while 1:
            data=conn.recv(4024)
            print('......'+str(data, 'utf8'))
            if not data:break

            obj = subprocess.Popen(str(data,'utf8'), shell=True, stdout=subprocess.PIPE)
            cmd_result = obj.stdout.read()
            # 获取发送数据的大小 为int类型,int类型无法与bytes类型相互转换,所以int要先转换成str然后再转换为bytes类型
            result_len=bytes(str(len(cmd_result)),'utf8')
            conn.sendall(result_len)
            conn.send(cmd_result)
    sk.close()

    #author: wylkjj
    #date:2019/4/18
    #客户端
    import subprocess
    import socket
    sk=socket.socket()
    address=('127.0.0.1',8000)
    sk.connect(address)
    while True:
        inp = input('>>>')
        if inp=='exit':
            break
        sk.send(bytes(inp,'utf8'))
        result_len=int(str(sk.recv(1024),'utf8'))
        print(result_len)
        # 接收数据,是bytes类型,数据量超过8k就不会接收,所以可以设置多次接收
        data = bytes()
        while len(data) != result_len: #判断data的长度是否与server端传来的长度相符
            recv = sk.recv(1024)
            data += recv
        print(str(data,'gbk'))
    sk.close()
3.粘包现象及解决办法
    #author: wylkjj
    #date:2019/4/18
    #服务端
    import subprocess
    import socket
    sk=socket.socket()
    address=('127.0.0.1',8000)
    sk.bind(address)
    sk.listen(2)
    print('waiting')
    while 1:
        conn,addr=sk.accept()
        print(addr)
        while 1:
            data=conn.recv(4024)
            print('......'+str(data, 'utf8'))
            if not data:break

            obj = subprocess.Popen(str(data,'utf8'), shell=True, stdout=subprocess.PIPE)
            cmd_result = obj.stdout.read()
            # 获取发送数据的大小 为int类型,int类型无法与bytes类型相互转换,所以int要先转换成str然后再转换为bytes类型
            result_len=bytes(str(len(cmd_result)),'utf8')
            conn.sendall(result_len)
            conn.recv(1024) #因为两个sand连一起发送会出现粘包现象,所以recv一下(利用recv的阻塞原理)
            conn.send(cmd_result)
    sk.close()

    #author: wylkjj
    #date:2019/4/18
    #客户端
    import subprocess
    import socket
    sk=socket.socket()
    address=('127.0.0.1',8000)
    sk.connect(address)
    while True:
        inp = input('>>>')
        if inp=='exit':
            break
        sk.send(bytes(inp,'utf8'))
        result_len=int(str(sk.recv(1024),'utf8'))
        sk.sendall("ok")
        print(result_len)
        # 接收数据,是bytes类型,数据量超过8k就不会接收,所以可以设置多次接收
        data = bytes()
        while len(data) != result_len: #判断data的长度是否与server端传来的长度相符
            recv = sk.recv(1024)
            data += recv
        print(str(data,'gbk'))
    sk.close()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值