笔记
昨日内容回顾:
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()