031-2018-1019 ftp功能讲解+操作系统

笔记

昨日内容回顾:

 

1  粘包解决方案二

先发送数据的长度 + 发送数据  #自定制消息头

Pack打包的数据长度 = 4个字节

 

Struct

打包:pack(‘i’,int类型数据) #21亿多,4个字节

解包:unpack(‘i’,pack的数据) 返回数据是个元组 拿数据需要加上[0]

2 ftp上传

看代码

 

3 socketserver

Import socketserver

Class A(socketserver.BaseRequestHandler):

Def handle(self):

Self.request.recv()   #conn

Send

close

if __name__ == ‘__main__’:

Ip_port = (‘127.0.0.1’,8001)

Server = socketserver.ThreadingTCPServer(ip_port,A)

Server.serve_forever()

 

前提:原生的tcp连接不能连接多个用户

今日内容:

1 ftp作业功能难点解释

进度条:

断点续传:

磁盘分配

 

 

2 进程

大概聊聊操作系统

 

程序:就是单纯的一个文件,一堆代码

进程:运行中的程序

 

操作系统:

同步 异步 阻塞 非阻塞

下周的内容:

进程  线程  协程  IO多路复用

FTP功能讲解:
#进度条打印,print版
# import time
# for i in range(20):
#     #\r 回到行首打印内容,如果同一行有内容,那么就被抹掉了
#     n = '>' * i
#     print('\r%s' %n,end='')
#     time.sleep(0.5)

#进度条打印,sys版
# import sys
# import time
# for i in range(10):
#     sys.stdout.write('>')
#     sys.stdout.flush()
#     time.sleep(0.5)


#搞百分比的样子
#0.42857142857142855 改成两位数,不进行四舍五入
# print(3/7) #0.42857142857142855
# print(round(3/7,2)) #0.43  43%
# print(int(3/7*100))

test.py

import threading
import time
def fun(n):
    time.sleep(2)
    print('>>>>',n)


if __name__ == '__main__':
    t = threading.Thread(target=fun,args=(13,))
    t.start()

    print('程序结束')

进度条FTP上传客户端.py

import socket
import struct
import os
import json

tcp_client = socket.socket()
server_ip_port = ('127.0.0.1',8001)
tcp_client.connect(server_ip_port)
read_size = 1024

file_info = {
    'file_path':r'D:\python_workspace\day031 ftp功能讲解+操作系统\bbb.mp4',
    'file_name':'bbb.mp4',
    'file_size':None,
}

#获取文件大小
file_size = os.path.getsize(file_info['file_path'])

#将文件大小添加到文件信息的字典中
file_info['file_size'] = file_size
#因为我们要发送的数据是字节类型,那么必须将字典转换为bytes类型,但是字典不能直接转换为bytes,所以我们想到了json,
#通过json模块将字典类型的文件信息数据转换为了json类型的字符串
file_info_json = json.dumps(file_info)
#获取了字符串的长度
file_info_len = len(file_info_json)
#将长度打包为4个字节的数据,
file_info_stru = struct.pack('i',file_info_len)
#将打包好的4个自己的数据和我的文件信息数据一起发送给了服务端
tcp_client.send(file_info_stru)
tcp_client.send(file_info_json.encode('utf-8'))

#统计文件数据
all_file_data = b''
#统计文件数据长度
all_size_len = 0

with open(file_info['file_path'],'rb') as f:

    while all_size_len < file_size:
        every_read_data = f.read(read_size)
        all_file_data += every_read_data
        #每次接受的长度的累加结果
        all_size_len += len(every_read_data)
        #发送每次读取的数据
        tcp_client.send(every_read_data)
        #得到一个百分比的浮点数
        percent_data = int(all_size_len/file_size* 100)
        print('\r%s%% %s'%(percent_data,'>'*(int(percent_data/5))) ,end='')



print(tcp_client.recv(1024).decode('utf-8'))
tcp_client.close()



进度条FTP上传服务端.py

import socket
import struct
import json
import os
tcp_server = socket.socket()
ip_port = ('127.0.0.1',8001) #127.0.0.1本机的回环地址,供内部程序之间测试用的
tcp_server.bind(ip_port)
tcp_server.listen()
#客户端上传的文件路径,都放在这个路径下
client_file_path = r'D:\jj'
conn,addr = tcp_server.accept()
#首先接收到文件信息长度转换出来的4个字节的数据
file_info_stru = conn.recv(4)
#解包文件信息的长度
file_info_len = struct.unpack('i',file_info_stru)[0]
#然后接收文件的描述信息
client_file_info = conn.recv(file_info_len).decode('utf-8')
#将接收到的json字符串反序列化
abc_file_info = json.loads(client_file_info)
print('abc_file_info>>>',abc_file_info)
client_file_size = abc_file_info['file_size']
recv_all_size = 0
#拼接一下全路径
client_full_path = client_file_path + '\\' + abc_file_info['file_name']
# client_full_path = os.path.join(client_file_path,abc_file_info['file_name'])
with open(client_full_path,'wb') as f:
    while recv_all_size < client_file_size:
        every_recv_data = conn.recv(1024)
        f.write(every_recv_data)
        recv_all_size += len(every_recv_data)


conn.send('小伙玩的行,上传成功!'.encode('utf-8'))
conn.close()
tcp_server.close()

你可能感兴趣的:(python)