Python3之ftp下载简单代码
来源:互联网 发布:php连不上mysql数据库 编辑:程序博客网 时间:2024/06/12 01:18
服务端
import osimport socketimport sysimport structfrom multiprocessing import Processdef get(filepath): ''' 下载功能 :return: ''' with open(filepath, 'rb') as f: for line in f: yield linethis_module = sys.modules[__name__]phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)phone.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)phone.bind(('127.0.0.1', 8081))phone.listen(5)while 1: conn, addr = phone.accept() while 1: try: data = conn.recv(8092) cmd, file_path = data.decode('utf-8').split() print(os.path.getsize(file_path)) file_path_list = os.path.split(file_path.strip()) print('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>') if os.path.exists(os.path.join(file_path_list[0], file_path_list[1])): res = struct.pack('i', os.path.getsize(file_path)) conn.send(res) if hasattr(this_module, cmd): func = getattr(this_module, cmd) g = func(os.path.join(file_path_list[0], file_path_list[1])) for i in g: conn.send(i) # # 定制报头 # header_dict = { # # 'total_size': 12, # 'filename': None # } # header_bytes = json.dumps(header_dict).encode('utf-8') # # 发送报头长度 # header_len = struct.pack('i', len(header_bytes)) # conn.send(header_len) # # 发送报头 # conn.send(header_bytes) # 发送数据部分 except Exception: break conn.close()phone.close()
客户端
import socketimport structphone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)phone.connect(('127.0.0.1', 8081))def get_to_file(data): ''' 获取文件内容 :param data: :return: ''' with open(r'c:\users\quincy_c\desktop\wo.mp3', 'ab') as f: f.write(data)''''''# =========实现打印进度条函数==========import sysimport timedef progress(percent, width=50): if percent >= 100: percent = 100 show_str = ('[%%-%ds]' % width) % (int(width * percent / 100) * "$") # 字符串拼接的嵌套使用 print("\r%s %d%%" % (show_str, percent), end='\n', file=sys.stdout, flush=True) # print()# =========应用==========# data_size = 3030333# recv_size = 0# while recv_size < data_size:# time.sleep(0.001) # 模拟数据的传输延迟# recv_size += 1024 # 每次收1024## recv_per = int(100 * (recv_size / data_size)) # 接收的比例# progress(recv_per, width=30) # 进度条的宽度30''''''while 1: # get C:\Users\Quincy_C\Desktop\qaz.txt cmd = input('请输入>>:').strip() if not cmd: continue cmd_list = cmd.split() filepath = cmd_list[1] phone.send(cmd.encode('utf-8')) header = phone.recv(4) data_size = struct.unpack('i', header)[0] recv_size = 0 while recv_size < data_size: # print('开始接收数据--->') data = phone.recv(10240) get_to_file(data) recv_size += len(data) recv_per = int(100 * (recv_size / data_size)) # 接收的比例 progress(recv_per, width=30) # 进度条的宽度30 # # 接收报头长度 # res = phone.recv(4) # # 对报头长度解压 # header_size = struct.unpack('i', res)[0] # # 接收报头长度的内容 # header_bytes = phone.recv(header_size).decode('utf-8') # # 对报头字典进行反序列化 # header_json = json.load(header_bytes) # # 获取数据长度 # data_size = header_json['total_size'] # # # 根据报头数据长度对数据进行接收 # recv_size = 0 # total_data = b'' # while recv_size < data_size: # data_recv = phone.recv(1024) # if (data_size - len(data_recv)) < 1024: # left_data = phone.recv(data_size - len(data_recv)) # total_data += left_data # total_data += data_recv # recv_size += len(data_recv) # # print(total_data.decode('gbk'))phone.close()
简单的实现了下载,很多地方需要完善,主要使用了生成器,还有一个简单的进度条,记录一下,后续会继续优化,要使用该功能,必须输入:
get C:\Users\Quincy_C\Desktop\qaz.txt这种形式。
阅读全文
0 0
- Python3之ftp下载简单代码
- java 代码之FTP服务器下载文件
- Python3 多线程下载代码
- python3之编写ftp爆破
- 简单实现FTP下载
- python3学习之路(2)简单的代码结构
- Java语言实现简单FTP软件------>FTP软件效果图预览之下载功能(二)
- ftp下载文件 简单示例
- FTP批量下载文件代码
- Qt之FTP上传/下载
- Qt之FTP上传/下载
- Qt之FTP上传/下载
- Qt之FTP上传/下载
- Apache FTP 简单的文件下载
- python的ftp下载的简单实现
- Python FTP 下载文件 简单示例
- Domino LotusScript代码实现Ftp上传、下载
- JAVA代码实现FTP文件下载
- MyBatis 详细介绍
- 考究Hadoop中split的计算方法
- 【PAT】Set Similarity&&Student List for Course
- 解决`向github提交代码是老要输入用户名密码`的问题
- J2EE进阶之JDBC数据库连接池 十九
- Python3之ftp下载简单代码
- mysql数据库case函数
- 真Unity3d_没看完这个先不要用2dtoolkit做UI
- Java版本HTTPSQS 纯java实现、 一个jar包、支持嵌入式启动、完全兼容HTTPSQS、TPS 1w+
- Css中,transform属性的matrix值简介
- 20170824 Java——I/O,字节流与字符流,BufferedOutputStream,InputStream等(附相关练习代码)
- TcpClient和UdpClient
- mysql提示符命令prompt
- python TCP/IP 编程