• 作业26


    作业:
    1.整理TCP三次握手、四次挥手图

    2.基于TCP开发一款远程CMD程序
    	客户端连接服务器后,可以向服务器发送命令
    	服务器收到命令后执行,无论执行是否成功,无论执行几遍,都将执行结果返回给客户端
    	
    	注意: 执行系统指令使用subprocess模块完成.
    
    服务端:
    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()
        while True:
            try:
                cmd = conn.recv(buffer_size)
                if not cmd: break
                cmd = cmd.decode('utf-8')
                print('收到客户端命令', cmd)
                res = subprocess.Popen(cmd, shell=True,  # 第一个参数:命令字符串,第二个参数指定由shell处理
                                       stderr=subprocess.PIPE,  # 将基本的输入、输出及错误都放入管道
                                       stdin=subprocess.PIPE,  # 这些在管道里的信息都是字节形式,编码为utf-8
                                       stdout=subprocess.PIPE
                                       )
                err = res.stderr.read()  # 定义一个err变量接收基本的错误信息
                if err:  # 如果错误信息不为空
                    cmd_res = err  # 输出的结果为基本的错误信息
                else:
                    cmd_res = res.stdout.read()  # 输出的结果为基本的输出信息
    
                if not cmd_res:  # 有些命令无返回结果,需要进行判断
                    cmd_res = '该命令没有返回结果'.encode('gbk')
                conn.send(cmd_res)  # 向客户端发送执行的结果
            except Exception:
                break
    
        conn.close()
    
    tcp_server.close()
    
    客户端:
    from socket import *
    
    ip_port = ('127.0.0.1', 8080)
    
    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
        cmd = cmd.encode('utf-8')
        tcp_client.send(cmd)
        cmd_res = tcp_client.recv(1024) # 这里会有粘包现象产生
        print('命令执行的结果是', cmd_res.decode('gbk'))    # windows系统默认编码为gbk
    

    输入终端命令:shutdown-r 或者shutdown-f 回车
    太牛X了
    太牛X了
    太牛X了

    如图:

  • 相关阅读:
    转载.net泛型理解说明
    转载Repository 和Unit of work的使用说明
    libtool的工作原理
    带有通配符的字符串匹配算法-C/C++
    linux core文件机制
    grep多条件和sed合并两行
    BZOJ 3232 圈地游戏 (分数规划 + SPFA找负/正环)
    CSP2019 D1T3 树上的数 (贪心+并查集)
    CSP-S 2019 第二轮 退役记
    object-c中的int NSInteger NSUInteger NSNumber辨析
  • 原文地址:https://www.cnblogs.com/gfhh/p/11693310.html
Copyright © 2020-2023  润新知