一  相关的模块

 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()

 

posted on 2017-09-26 15:30  方少0410  阅读(177)  评论(0编辑  收藏  举报