zoukankan      html  css  js  c++  java
  • python——简易的cmd码交互

    cmd_server

    import socket
    import  subprocess#可执行shell命令
    sk=socket.socket()
    address=('127.0.0.1',8000)
    sk.bind(address)
    sk.listen(3)
    print('waiting...')
    
    while 1:
        conn,addr=sk.accept()
        while 1:
            try:
                data=conn.recv(1024)#数据过大 会导致接收不完全
            except Exception as e:
                print('客户已离开')
                break
            if not data:break
            print(str(data,'utf-8'))
    
            obj=subprocess.Popen(str(data,'utf-8'),shell=True,stdout=subprocess.PIPE)
            #stdout为标准输出 PIPE为管道 作用为将进程转为主进程 (封装了)
            #若不加最后一句 无法将其取到 赋值在变量上
            cmd_result=obj.stdout.read()
            result_len=bytes(str(len(cmd_result)),'utf-8')
            # int类型不能直接转为bytes 需要通过str来中间过渡
            conn.sendall(result_len)
            conn.recv(1024)#用于隔断
            conn.sendall(cmd_result)
    sk.close()
    
    """""
    client端发送一个指令 然后server端将结果进行返回
    
      解决问题:若传输的命令结果过大,要多次接收,导致下一个命令无法执行
      解决方法:利用len函数对传输的结果进行长度判断,之后传输给client端
    再由client进行while循环判断
      需要注意的:1.传输只会传bytes类,同时int无法直接转为bytes 所以需要用str进行过度
      2.两个send在一起有可能会粘包,所以需要一个隔断 若用time模块 time.sleep()进行休眠的话 会拖延进程
      所以再加任意'  收与发'就好
    """

    cmd_clinet:

    import socket
    
    address=('127.0.0.1',8000)
    
    sk=socket.socket()
    
    sk.connect(address)
    
    while True:
        a=input(">>>")
        if a=='exit':
            break
        sk.send(bytes(a,'utf-8'))
        recv_len=int(str(sk.recv(1024),'utf-8'))
        sk.send('ok')#用于隔断
        print(recv_len)
        data=bytes()
        while len(data)!=recv_len:
            recv=sk.recv(1024)
            data+=recv
        print(str(data,'gbk'))
    sk.close()
    """""
    
    """
  • 相关阅读:
    HDU_3496_(二维费用背包)
    HDU_3732_(多重背包)
    HDU_2079_(01背包)(dfs)
    HDU_2844_(多重背包)
    Codeforces_766_D_(并查集)
    HDU_3591_(多重背包+完全背包)
    struts2标签
    ongl 表达式
    result 相关
    struts2页面输出错误信息
  • 原文地址:https://www.cnblogs.com/zzzi/p/11494539.html
Copyright © 2011-2022 走看看