socket远程执行命令

server类

import socket
import subprocess

sk = socket.socket()  #创建socket

#添加地址bind绑定
address = ("127.0.0.1",9595)
sk.bind(address)

#支持多少人
sk.listen(2)

#接收客户端信息
while True:
    conn,addr = sk.accept()
    print(addr,"这个位置是下一次另一个客户端打开后能自动接收")
    while True:
        try:
            cr = conn.recv(1024)
        except Exception as e:            #如果直接点击客户端直接点击
            print("jimao------",e)
            break
        # print(cr, "--nn------------")  # 判断客户端停止后返回值
        if not cr:break

        print(cr, "--------------")  # 判断客户端停止后返回值
        data = str(cr, "utf8")
        # print(str(cr))   #这个不能接收中文,只能接收字母数字

        # 发送信息

        #stdout 标准输出   PIPE 管道     Popen 打开进程文件指针
        #stdout=subprocess.PIPE子线程通过管道输出到主线程

        obj = subprocess.Popen(data,shell=True,stdout=subprocess.PIPE)
        obj_read = obj.stdout.read()   #接收指令data,再格式化输出
        print("iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",type(obj))

        #计算长度,传递到客户端来判断客户端是否继续接收
        len_write = len(obj_read)

        conn.sendall(bytes(str(len_write),"utf8"))  #发送接收到的指令长度发送到客户端

        conn.sendall(obj_read)
clinet类

import socket
sk = socket.socket() #创建socket对象

#连接服务端
address = ("127.0.0.1",9595)
sk.connect(address)
#发送信息到服务端
while True:
    inp = input("这是客户端:")
    if inp == "88":
        exit()
    else:
        sk.send(bytes(inp,"utf8"))

    #接收信息
    sr = sk.recv(1024)  #
    print("00000000000000",type(sr))
    sr_len = int(str(sr,"utf8"))  #把传过来的byte长度转换成int型
    print("-----------",sr_len,"---",sr)
    if sr:
        num = bytes() #创建一个
        #接收的长度和总和和传过来的长短一样时就返回
        while len(num) != sr_len:
            # 再次接收文件
            sk_len = sk.recv(1024)  # 第二次接收byte型类型
            num += sk_len  # 把第二次接收的byte类型写进num中
            # print(str(sk_len,"gbk"),"
        print(str(num, "gbk"))

    else:
        break

猜你喜欢

转载自www.cnblogs.com/TKOPython/p/12407746.html