python socket3 dir/cd/md指令操作 下载文件

server

#-*- coding:utf-8 -*-
import os,socket

#获取dir/ipconfig 等指令,读取的数据
def sendCmdData(conn,cmd):
    res = os.popen(cmd).read()
    print(res)
    # 先发送指令值的长度
    conn.send(str(len(res.encode())).encode())
    conn.recv(1)
    conn.send(res.encode())

#执行指令操作WIN
def cmd_exec(conn,cmd,filename):
    if cmd==('md' or 'MD'):
        #1.显示当前目录
        sendCmdData(conn, 'dir')
        #2创建自己的目录
        os.mkdir(filename)
        conn.recv(1)#解决传输过程中数据粘合问题
        sendCmdData(conn, 'dir')
    elif cmd==('cd' or 'CD'):
        sendCmdData(conn, 'dir')
        # 2进入自己的目录
        os.chdir(filename)
        conn.recv(1)#解决传输过程中数据粘合问题
        sendCmdData(conn, 'dir')

    else:
        sendCmdData(conn, cmd)
#解析指令
def get_cmd_str(conn,data):
    #cmd_str=data[0],data[1]=filename
    #str处理取出cmd,filename
    cmd_data=data.split(',')
    if cmd_data[0]=='1':
        #cmd,cmd_name
        cmd_exec(conn,cmd_data[1],cmd_data[2])


    elif cmd_data[0]=='2':
        #下载 filename
        print(cmd_data[2])
        print(os.getcwd())
        filename = cmd_data[2]
        if os.path.isfile(filename):
            get_file = open(filename, 'rb')
            file_size = os.stat(filename).st_size
            print(filename,file_size)

            conn.send(str(file_size).encode('utf-8'))

            res_size=conn.recv(1024).decode()
            print('client传过来的大小:',res_size)

            #发送文件数据
            for line in get_file:
                 print(line)
                 conn.send(line)
                # print('md5:',m.hexdigest())
            get_file.close()

        else:
            pass


    elif cmd_data[0]=='3':
        #上传 filename
        print(cmd_data[2])
        #put(conn, cmd_data[2])
    else:
        print('指令错误')

print(os.getcwd())
server=socket.socket()
server_name=input('请输入服务器ip,服务器端口位8888 >>:').strip()
server.bind((server_name,8888))
server.listen(5)

while True:
    print('等待客户端连接。。。')
    conn,addr=server.accept()
    print(addr,'已经连接成功。。。')

    while True:
        # 接收指令
        cmd_str=conn.recv(1024)
        cmd_str_decode=cmd_str.decode()
        print(cmd_str_decode)
        if cmd_str_decode=='Q':
            break
        # 对指令进行解析
        get_cmd_str(conn,cmd_str_decode)
        print(os.getcwd())

        #conn.send(b'server-response')
server.close()



client


#-*- coding:utf-8 -*-
import os,socket

def help():
    print('输入get/cmd+,+/上传(u)/下载(d)+,+文件名/路径+文件')
    print('1.输入get dir filename=>上传文件到服务器指定的文件夹')
    print('2.输入put dir filename=>下载文件到本机指定的文件夹')
    print('3.输入cmd 指令名称 data=>执行并显示指令返回值')
    print('4.输入Q退出')
    print('5.输入H=>显示帮助信息')
    print('''
        x代表任意字母或数字  
        dir x x  显示client 的当前目录
        cd  
        cmd cd d 进入当前目录下的dd文件夹
        cmd cd .. 返回上级目录
        cmd dir x  显示当前目录
        cmd md aa 在当前目录下建立aa文件夹

    ''')
    get_input_data()


def get_input_data():
    while True:
        str = input('"H"显示帮助信息>>:').strip()
        if str == 'Q':
            return 1
        elif str == 'H':
            help()
        elif str.count(' ') == 2:
            cmd, dirname, filename = str.split(' ')
            if cmd == 'get':
                str = '2,' + dirname + ',' + filename
            elif cmd == 'put':
                str = '3,' + dirname + ',' + filename
            elif cmd == 'cmd':
                str = '1,' + dirname + ',' + filename

            elif cmd=='dir':
                print(os.getcwd())
                print('客户端>>:',os.popen('dir').read())
                continue
            elif cmd=='cd':
                print(os.getcwd())
                if os.path.isdir(dirname):
                    os.chdir(dirname)
                print('客户端>>:',os.popen('dir').read())
                continue
            elif cmd=='md':
                print(os.getcwd())
                os.mkdir(dirname)
                if os.path.isdir(dirname):
                    os.chdir(dirname)
                print('客户端>>:',os.popen('dir').read())
                continue

            else:
                print('输入格式不正确,正确格式:输入get/put/cmd 目录 文件名')
                continue
            return str

        else:
            print('输入格式不正确,正确格式:输入get/put/cmd 目录 文件名')
            continue

def get_cmd_str(client,data):
    #cmd_str=data[0],data[1]=filename
    #str处理取出cmd,filename

    cmd_data=data.split(',')
    print(cmd_data)
    if cmd_data[0]=='1':
        #cmd,cmd_nameclient
        cmd_exec(client, cmd_data[1],cmd_data[2])

    elif cmd_data[0]=='2':
        #下载 filename
        print(cmd_data[2])
        print(os.getcwd())
        filename = cmd_data[2]
        #创建文件
        f = open(filename, 'wb')
        #1. 接收文件大小
        file_size=client.recv(1024).decode()
        print(file_size)
        #给服务器一个相应,已经收到大小数据
        client.send(file_size.encode('utf-8'))
        res_size = 0
        while res_size < int(file_size):
            f_data = client.recv(1024)
            res_size += len(f_data)
            f.write(f_data)
            print(file_size, res_size)
        else:
            print('文件接收完成')
            f.close()
    elif cmd_data[0]=='3':
        #上传 filename
        print(cmd_data)
        #put(client, cmd_data[2])

    else:
        print('指令错误')

def cmd_exec(client,cmd,filename):
    if cmd==('md' or 'MD'):
        recCmdData(client, cmd)
        client.send(b'1')#解决传输过程中数据粘合问题
        recCmdData(client, cmd)
    elif cmd==('cd' or 'CD'):
        recCmdData(client, cmd)
        client.send(b'1')#解决传输过程中数据粘合问题
        recCmdData(client, cmd)

    else:
        #接收数据的长度
        recCmdData(client, cmd)

def recCmdData(client,cmd):
    # 接收数据的长度
    data_all_size = int(client.recv(1024).decode())
    print(data_all_size)
    client.send(b'1')
    res_size = 0
    while res_size < data_all_size:
        data = client.recv(1024)
        res_size += len(data)
        print(data.decode())
    print('服务器端信息>>:',data_all_size, res_size)


print(os.getcwd())
client=socket.socket()
server_name=input('请输入服务器ip,服务器端口位8888 >>:').strip()
client.connect((server_name,8888))
while True:
    str=get_input_data()
    if str==1:
        client.send('Q'.encode('utf-8'))
        break
    else:
        print(str)
        get_dir=str.split(',')[1]
        print(get_dir)

        client.send(str.encode('utf-8'))
    get_cmd_str(client, str)
    print('客户端>>:',os.getcwd())

    #验证输入
    # print(cmd.find('get',0,3))
client.close()



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值