美文网首页
【第45天】python全栈从入门到放弃

【第45天】python全栈从入门到放弃

作者: 36140820cbfd | 来源:发表于2019-08-01 22:12 被阅读0次

    1.while 1和while 0

    while -4:
        print(1)
    
    while 5:
        print(1)
    
    while 1:
        print(1)
    
    while 0:    #只有0是假,其它都是真
        print(1)
    
    

    2.电脑定时息屏

    import time
    from ctypes import *
    
    def closewindows(closetime):
        while closetime>0:
            print(closetime)
            time.sleep(1)
            closetime-=1
        user32 = windll.LoadLibrary('user32.dll')
        user32.LockWorkStation()
    
    
    if __name__ == "__main__":
        closewindows(3)
    
    
    

    4.struct的pack和unpack的使用

    import struct
    a=890000000
    res=struct.pack('i',a)   #bytes
    print(res,len(res))
    print(struct.unpack('i',res))  #得到一个元组
    

    5.json序列化json.dumps()和json.loads()

    import json
    
    menu = {"1":"upload"}   #字典不能传输
    
    print(menu)    #{'1': 'upload'}
    print(type(menu))   #  <class 'dict'>
    print(len(menu))    #1
    
    #json序列化为字符串 json.dumps()
    res=json.dumps(menu)
    print(res)   #{"1": "upload"}
    print(type(res))   #<class 'str'>
    print(len(res))    #15
    
    #json反序列化json.loads()
    res1=json.loads(res)
    print(res1)   #{'1': 'upload'}
    print(type(res1))   #<class 'dict'>
    print(len(res1))    #1
    

    6.利用cocket实现客户端和服务端大文件的传输

    客户端代码:

    import socket
    import os
    import json
    import struct
    sk = socket.socket()
    sk.connect(("127.0.0.1",8001))
    menu = {"1":"upload","2":"download"}
    for k,v in menu.items():
        print(k,v)
    num = input("请输入功能选项:")
    if num == "1":
        dic = {"opt":menu.get(num),"filename":None,"filesize":None}
        file_path = input("请输入一个绝对路径:")# 文件的绝对路径
        # E:\Python S14\day32\实现大文件的传输\11.mp4
        filename = os.path.basename(file_path)# 文件名字
        filesize = os.path.getsize(file_path)# 获取用户输入的路径中文件的大小
        dic["filename"] = filename
        dic["filesize"] = filesize
        str_dic = json.dumps(dic)
    
        len_dic = len(str_dic)# 获取到字典的长度,是一个int类型的数据   46   146
        b_len_dic = struct.pack('i',len_dic)# 用一个4bytes的数据表示字典的长度
    
        sk.send(b_len_dic + str_dic.encode("utf-8"))# 将bytes类型的字典的长度 + bytes类型的字典的内容,一起发送给服务器
    
    
        with open(file_path,"rb") as f:
            while filesize:
                content = f.read(1024)
                sk.send(content)
                filesize -= len(content)
    
    sk.close()
    

    服务端代码:

    import socket
    import json
    import struct
    sk = socket.socket()
    sk.bind(("127.0.0.1",8001))
    sk.listen()
    conn,addr = sk.accept()
    
    b_len_dic = conn.recv(4)
    len_dic = struct.unpack('i',b_len_dic)[0]# 获取到int类型字典的长度,
    # unpack得到的是一个元组,要取下标为0的位置
    str_dic = conn.recv(len_dic).decode('utf-8')   #得到字典
    # str_dic = {"opt":menu.get(num),"filename":None,"filesize":None}
    dic = json.loads(str_dic)    #还原字典
    
    if dic["opt"] == "upload":
        filename = "new"+ dic["filename"]
    
        with open(filename,"ab") as f:
            while dic['filesize']:
                content = conn.recv(1024)
                f.write(content)
                dic['filesize'] -= len(content)
    
    elif dic["opt"] == "download":
        # 客户端发来一个字典要执行的功能,以及客户端自己的绝对路径
        # 服务器要返回这个绝对路径中所有文件及文件夹
        # 客户端自己选择进入到哪一层目录下
        # 服务器都要返回对应目录下所有文件及文件夹
        # 客户随时选择某一个目录下的某一个文件进行下载
    
    
        # 客户端发送来一个字典,包含了要进行的操作,要下载的文件的绝对路径,
        # 根据绝对路径去读取文件内容
        # 一边读,一遍发
        pass
    
    conn.close()
    sk.close()
    
    

    7.切换目录,输入一个绝对目录,如果输入..返回上一层目录并返回上层目录的文件,如果输入cd+目录,则转到相应目录,并输出所在目录下的文件。

    客户端代码:

    import socket
    import os
    
    sk = socket.socket()
    sk.connect(('127.0.0.1',8080))
    
    
    abs_path = input('请输入您的根目录:')
    sk.send(abs_path.encode('utf-8'))    #发送用户输入根目录
    current_dir = sk.recv(1024).decode('utf-8')
    print(current_dir.split('--'))   #获取到当前目录列表
    
    while 1:
        cmd = input('请输入>>>')
        # cd + 文件夹      ..
        if cmd == '..':
            sk.send(cmd.encode('utf-8'))
            current_dir = sk.recv(1024).decode('utf-8')
            print(current_dir.split('--'))  #拿到列表
        if cmd == 'cd':
            filename = input('请输入一个文件夹名:')
            sk.send((cmd+' '+filename).encode('utf-8'))
            current_dir = sk.recv(1024).decode('utf-8')
            print(current_dir.split('--'))
    
    sk.close()
    

    服务端代码:

    #  切换目录
    import socket
    import os
    
    sk = socket.socket()
    sk.bind(('127.0.0.1',8080))
    sk.listen()
    conn,addr = sk.accept()
    
    def send_data(conn,path):
        '''你给我一个目录,我把目录发给client'''
        lis_dir = os.listdir(path)   #以列表形式获取当前目录下的东西
        str_dir = '--'.join(lis_dir)   #拼接成字符串发送
        conn.send(str_dir.encode('utf-8'))  #发送给服务端
    
    abs_path = conn.recv(1024).decode('utf-8')# 获取用户输入的绝对路径
    
    current_dir = abs_path + '/'# 以下再处理,都要根据当前路径去处理,无论是返回上一层,还是进入下一层
    send_data(conn,current_dir)# 把用户输入的路径下的所有文件及文件夹返回给客户端
    
    # C:/Program Files (x86)/Common Files
    
    while 1:
        cmd = conn.recv(1024).decode('utf-8')
        if cmd == '..':
            current_dir = current_dir.split('/')[:-2]   #拿到上个目录
            current_dir = '/'.join(current_dir)+'/'    #拿到字符串
            # if 如果当前是C盘:
            #     就返回给客户端告诉说没有上一层了!
            send_data(conn, current_dir)
        else:
            filename = cmd.split(' ')[1]# 获取用户输入的文件名字
            current_dir += filename + '/'# 将文件名字添加到当前路径下,组成一个完整的新路径
            if os.path.isdir(current_dir):# 如果客户输入的文件名字是一个文件夹
                send_data(conn, current_dir)
            else:# 如果不是一个文件夹
                conn.send(b'您输入的不是文件夹')
    
    conn.close()
    sk.close()
    
    别跑,点个赞再走

    相关文章

      网友评论

          本文标题:【第45天】python全栈从入门到放弃

          本文链接:https://www.haomeiwen.com/subject/fvrhdctx.html