zoukankan      html  css  js  c++  java
  • 网络编程之系统操作

    一  相关的模块

     1 subprocess模块:执行系统模块

      subprocess.Popen():调用当前系统来执行命令。

       stdout:标准正确的输出

       stderr:错误的输出

       stdin:输入

       shell=True:系统解释器

       subprocess.PIPE:就是一个管道

     2 struct模块

     struct.pack:打包成一个bates类型

     struct.unpack:解包,解包一个bates的类型

      struct的一些方法:

    详细网站:http://www.cnblogs.com/coser/archive/2011/12/17/2291160.html

    实例一:

      服务端:

    import socket
    import subprocess
    import struct
    phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    phone.bind(('127.0.0.1',8080))
    phone.listen(10)
    while True:
        conn,addr=phone.accept()
        print(addr[0:2])
        while True:
            try:
                msg=conn.recv(1024).decode('utf-8')
                obj=subprocess.Popen(msg,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
                stdout=obj.stdout.read()
                stderr=obj.stderr.read()
                tes=struct.pack('i',len(stdout)+len(stderr))
                conn.send(tes)
                conn.send(stdout)
                conn.send(stderr)
            except Exception:
                break
        conn.close()
    phone.close()
    

      客户端:

    import socket
    import struct
    phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    phone.connect(('127.0.0.1',8080))
    while True:
        msg=input('>>>:').strip()
        phone.send(msg.encode('utf-8'))
        if not msg:continue
        tes=phone.recv(4)
        tes_size=struct.unpack('i',tes)[0]
        print(tes_size)
        msg_data_1=b''
        data_size=0
        while data_size<tes_size:
            msg_data=phone.recv(1024)
            msg_data_1+=msg_data
            data_size+=len(msg_data)
    
        print(msg_data_1.decode('gbk'))
    phone.close()
    

     实例二:

      服务端:

    import socket
    import subprocess
    import struct
    import json
    phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    phone.bind(('127.0.0.1',8080))
    phone.listen(10)
    while True:
        conn,addr=phone.accept()
        print(addr[0:2])
        while True:
            try:
                msg=conn.recv(1024).decode('utf-8')
                obj=subprocess.Popen(msg,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
                stdout=obj.stdout.read()
                stderr=obj.stderr.read()
                ret_dic={'filename':'a.txt','filesize':len(stdout)+len(stderr)}   #设定报头
                ret_bytes=json.dumps(ret_dic).encode('utf-8')   #首先转成字符传类型,再转成bytes类型
                conn.send(struct.pack('i',len(ret_bytes)))       #发送转成bytes类型后打包的固定字节长度
                conn.send(ret_bytes)                              #发送转成后的bytes类型
                conn.send(stdout)
                conn.send(stderr)
            except Exception:
                break
        conn.close()
    phone.close()
    

       客户端:

    import socket
    import struct
    import json
    phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    phone.connect(('127.0.0.1',8080))
    while True:
        msg=input('>>>:').strip()
        phone.send(msg.encode('utf-8'))
        if not msg:continue
        ret_size=struct.unpack('i',phone.recv(4))[0]        #接收报头的长度
        tes_size=json.loads(phone.recv(ret_size).decode('utf-8'))['filesize']    #接收报头并转成字典类型并提取接收数据的长度
        msg_data_1=b''      #设置一个接收数据bytes类型为空
        data_size=0         #设置一个接收数据的大小为0
        while data_size<tes_size:  #循环条件
            msg_data=phone.recv(1024)   #接收数据的大小
            msg_data_1+=msg_data    #添加数据到设置的空的数据里
            data_size+=len(msg_data)      #接收数据的大小自加每次接收的大小
        print(msg_data_1.decode('gbk'),tes_size)
    phone.close()
    
  • 相关阅读:
    phpMyAdmin 尝试连接到 MySQL 服务器,但服务器拒绝连接 解决办法
    MySQL意外关闭, 导致软件崩溃而无法启动的解决办法
    !function 笔记
    C++中四种类型转换方式
    SpringCloud面试题及答案
    Spring Boot面试题
    javaWeb常用面试题
    mysql行转列 问题 SUM(IF(条件,列值,0))
    mysql行列转换
    C++面试常见题
  • 原文地址:https://www.cnblogs.com/fangjie0410/p/7597051.html
Copyright © 2011-2022 走看看