• python_day26__socke网络编程之subprocess方法_产生在DOS环境下执行的子进程以执行DOS命令符


      压力大,那就慢慢来吧,一件事一件事的去做,累了就休息,心态最重要~~~(梳理一下最近的任务:软著、专利、python、数字信号英文综述、数字信号作业实验报告
    统计学作业、数字图像处理四节课重点整理),时间会把这一件件事情给抹去的。


    #Author:'haijing'

    #date:2018/11/8

    #服务端:在别人的哪里
    #必须线开启server端
    #此代码可以执行在客户端输入的dos环境下的命令,并在客户端返回执行的命令的结果

    import socket #socket是一个接口 内部封装了有关ip地址和端口号的信息 并且创建ip和端口号
    import subprocess #下面目前就使用一个类Popen,让代码在dos环境下运行

    sk = socket.socket() #创建一个socket对象s 服务端的sk对象和客户端的sk对象完全是不一样的
    address = ('127.0.0.1',8000) #设置一个元组,元组内放的是ip和端口号:8000
    sk.bind(address) #绑定ip和端口号,bind方法后跟的必须是一个元组
    sk.listen(3) #3表示服务端最多和三个客户端同时建立通信,但是传送信息的话只能是一个一个的来
    print('waiting...')
    conn,addr = sk.accept() #客户端开启之后就一直在这里等待着

    while 1:
    #min收
    try: #如果try下的语句出错,那么就去执行except中的语句
    data_recv = conn.recv(1024) #接收客户端发送过来的dos环境下的命令,1024为接收命令的长度
    data_recv = str(data_recv,'utf8') #命令转换为字符串的形式
    except:
    conn, addr = sk.accept() # 重新去接收另外的一个客户端的ip
    data_recv = conn.recv(1024) #接收客户端发送过来的dos环境下的命令
    data_recv = str(data_recv, 'utf8') #命令转换为字符串的形式
    # if not data: break #如果接收到对方发是空子节,那么同时结束对话
    if not data_recv:
    conn, addr = sk.accept() #如果对方退出了,则server端可以在这里另外接受新的网友
    continue #继续去判断while循环的条件是否成立
    print(data_recv) #打印接收的dos命令

    #min发送数据长度
    #Popen为一个类 下一句为创建obj对象stout为标准输出,PIPE为管道,
    #加上stdout=subprocess.PIPE这一句后,将subprocess.Popen(data,shell=True)的信息全都封装到obj中去,而不在屏幕中显示
    # obj = subprocess.Popen(data, shell=True)会打印obj这个对象的内容
    obj = subprocess.Popen(data_recv,shell=True,stdout=subprocess.PIPE)#data_recv(注意data_recv为字符串格式)为要执行的命令,shell和stdout为参数
    cmd_result = obj.stdout.read() #通过这一句就可以将obj中封装的信息(子进程中的执行结果信息)读出来,二进制类型

    result_len = len(cmd_result) #取出cmd_result的长度,result_len是一个int整形
    result_len = str(result_len) #int类型和bytes类型不可直接转换,故先转成str形 *****
    result_len = bytes(result_len,'utf8') #传数据的话只能传bytes类型,所以这里进行一个转换

    conn.sendall(result_len) #先发送一个数据的长度,等待对方接收,如果没接收,那么就一直停在这里

    #min再次发送数据
    conn.sendall(cmd_result) #将dos环境下执行的结果发送出去,因为cmd_result是dos环境下利用电脑自带的编码方式进行自动编码的,此电脑编码方式是gbk
    #所以在cmd_client端下解码要用gbk解码方式

    #Author:'haijing'
    #date:2018/11/8

    #客户端
    #必须线开启server端
    #此代码可以执行在客户端输入的dos环境下的命令,并在客户端返回执行的命令的结果

    import socket

    sk = socket.socket() #创建socket对象 服务端的sk对象和客户端的sk对象完全是不一样的
    address = ('127.0.0.1',8000) #设置元组 里面放的是需要连接的服务器的ip地址
    sk.connect(address) #连接ip地址为127.0.0.1的服务端

    while 1:
    #jing发 不能发空,否则对方会停在阻塞的状态
    inp_jing = input('>>>') #输入一个dos命令
    if inp_jing == 'exit': #如果输入exit,那么聊天终止,但是还是会给对方放inp_haijing这一条消息的
    break
    inp_jing = bytes(inp_jing,'utf8')
    sk.sendall(inp_jing) #如果字节很多的话,send()可能发不完,但是sendall可以发完的

    #jing收数据长度
    result_len = sk.recv(1024) #result_len为bytes类型,即这个数字是bytes型的
    result_len = str(result_len,'utf8') #由于bytes不能直接转换成int型,先转成str型的,由于在cmd_server端是用utf8编码的,所以这里也要用utf8解码
    result_len = int(result_len) #此时result_len就是int型了
    print(result_len)

    #jing收数据
    data = bytes() #新建一个空的bytes类型的变量data
    while len(data) != result_len: #如果data_recv的长度不等于上一次接收的数据的长度,那么就一直去接收
    data_recv = sk.recv(1024)
    data += data_recv #将前几次接收的bytes类型的数据data_recv累加起来 *****
    print(str(data,'gbk')) #因为cmd_result是dos环境下利用电脑自带的编码方式进行自动编码的,此电脑编码方式是gbk,所以在这里解码要用gbk解码方式


    sk.close #关的此客户端是和服务端之间的通信通道,同样server端也是有关掉通信通道的能力,但是server端一般是不会关的

    haijing in HZ 阴天 有点冷了,不过实验室有空调的

    2018.11.08 傍晚



























  • 相关阅读:
    位军营 20190919-4 测试,结对要求
    位军营 20190919-5 代码规范,结对要求
    国内源
    hexo安装-nodejs
    python调用chrome打开指定网址
    生成证书,用于签名Android应用
    cygwin64-安装包管理工具
    Android-删除指定包名的App
    pyqt5加载网页的简单使用
    打包python到exe
  • 原文地址:https://www.cnblogs.com/YiYA-blog/p/9931206.html
Copyright © 2020-2023  润新知