美文网首页
【第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