前言
今天,我要描述一个FTP的故事
主要内容
嗯,今天主要以阶梯性的形式来做一个FTP项目。
第一步:
我要实现这么一个功能,一个FTP客户端,1个FTP服务端,2端建立连接以后可以进行通讯。
服务端
#!/usr/bin/env python # -*- coding:utf-8 -*- # Author: Leon xie import socket #倒入模块 import json s = socket.socket() #申明网络模式 s.bind(('localhost',9001)) #绑定 s.listen(5) #监听 while True: conn,client_addr = s.accept() print("got a new conn:",client_addr) #与客户端持续交互 while True: data = conn.recv(1024) print("recv data:",data) data = json.loads(data.decode()) if data.get('action') is not None: #如果是合法的格式 if data['action'] == "put": #客户端发送文件到服务端 file_obj = open(data["filename"],'wb') received_size = 0 while received_size <data["size"]: recv_data = conn.recv(4096) file_obj.write(recv_data) received_size += len(recv_data) print(data['size'],received_size) else: print("successfully received file [%s]",data['filename']) file_obj.close() elif data['action'] == "get": #客户端下载文件从服务端 pass
客户端
#!/usr/bin/env python # -*- coding:utf-8 -*- # Author: Leon xie import socket import os import json client = socket.socket() client.connect(('localhost',9001)) while True: choice = input(">>").strip() if len(choice) == 0:continue #解析两条不同的指令 cmd_list = choice.split() if cmd_list[0] == "put": if len(cmd_list) == 1: print("no filename follows after put cmd") continue filename = cmd_list[1] #这个就是文件名了 if os.path.isfile(filename): file_obj = open(filename,'rb') #二进制格式传输,这样省去了encode base_filename = filename.split("/")[-1] #print(filename,os.path.getsize(filename)) print(base_filename,os.path.getsize(filename)) #print(file_obj,os.path.getsize(filename)) #告诉对方我要发什么 data_header = { "action":"put", "filename":base_filename, "size":os.path.getsize(filename) } #client.send(json.dump(data_header)) client.send(json.dumps(data_header).encode()) #发送 for line in file_obj: client.send(line) print("----send the file done----") else: print("file is not valid.") continue if cmd_list[0] == "get": pass
实现了最简单的文件传输
客户端输出
>>put f:/test.7z test.7z 351004454 ----send the file done---- >>
服务端输出
351004454 351004083 351004454 351004104 351004454 351004447 351004454 351004454 successfully received file [%s] test.7z