• python--网络编程--主机命令执行


    import os
    os.system()#执行系统命令
    #只能执行命令不能返回值
    import subprocess # 能执行系统命令
    res=subprocess.Popen('dir',shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE) #第一个参数是执行命令的字符串形式,第二个是shell=True代表使用命令解释器
    #PIPE是subprocess提供的一个功能,管道。可以让结果不打印存在管道里面
    print(res.stdout.read().decode('gbk'))#用stdout正确输出管道,read管道里面的数据

    windows里面是gbk格式的所以要转gbk
    stderr是错误的结果 stdout是正确的结果
    如果想让用户错误和正确的结果都可以看见的话要建立两个管道一个正确的一个错误的
    命令正确的话就进入正确管道stdout拿取结果
    如果命令错误的话就进入错误的管道stderr拿取结果
    命令中如何使用管道:
    要查看windows中都开了哪些任务命令:tasklist
    如果想看看是不是运行了pycharm或者别的程序:findstr pycharm
    程序中:tasklist ! findstr pycharm     感叹号就是管道
    有管道tasklist会将结果暂存在管道中,然后由findstr pycharm来循环判断
    还有一种管道:

    import subprocess
    subprocess.Popen('dir',shell=True,stdin=subprocess.PIPE)#也是一个管道

    如果在输入命令时最大recv是1024  像tasklist之类的命令数据太多,如果取出数据大于1024
    那么管道内的数据无法完全取出。接下来再输入命令取出的管道内的数据还是之前命令的那样命令就会乱
    SOCK_STREAM流式协议就是TCP协议
    TCP使用了nagle算法,将多次间隔较小且数据量小的数据,合并成一个大数据发出去
    所以会有粘包现象,所以上面取出数据,是因为粘包了分不清谁是谁。
    socket里面推荐使用 from socket import *
    粘包现象发送端和服务端都会粘包
    服务端接收的少了剩下的会留在那粘包,下次再继续接受
    客户端发送的太多了也会粘包。
    发送数据长所以要把长度发在前面,关键点在于recv收的量,高速长度就可以解决接受的问题
    但是一次传进来的太大,大过了系统内存就无法存了,所以需要一次一次边传数据边写数据,循环接受
    下载文件就是打开文件将文件数据传给接收端再写新文件写入的过程

    先收报头,固定报头的bytes 然后确定长度
    得让接收端知道多少的bytes是我的报头没所以报头固定长度。
    要用到struct模块
    struct.pack('i',123456),括号内i是整型,将后面整型的数据打包成一个bytes格式
    固定长度是4所以可以用这个模块固定报头的长度
    struct.unpack('i',收到的) 解包,将打包时候的数据接收了解包出来。取出来是个元祖
    第一个数据就是打包的所以索引0直接取

    因为struct.pack  的i格式打包不了  报头要传的数据很多
    所以要用字典的方法来打包报头

  • 相关阅读:
    XCode快捷键 转
    [iOS] UIView的clipsTobounds属性
    ios 重用UI部分代码的好方法(再也不用为局部变量的命名而烦恼啦!)
    symbol(s) not found for architecture armv7
    duplicate symbol _main in: / linker command failed with exit code 1
    xcode4.3.2 arc模式下导入非arc的文件 转
    objective-c block 详解 转
    将asi-http-request引入到ARC工程需要做的 转
    浅用block 转
    在Xcode4.5中禁用ARC(Automatic Referencing Counting) 转
  • 原文地址:https://www.cnblogs.com/gaoshengyue/p/7598353.html
Copyright © 2020-2023  润新知