Directory--->ftp_client
ftp_client.py
import socket,hashlib,os,json
class FtpClient(object):
def __init__(self):
self.client=socket.socket()
def help(self):
msg="put+filename"
print(msg)
def connect(self,ip,port):
self.client.connect((ip,port))
def interactive(self):
#self.authenticate()验证登录
while True:
cmd=input(">>")
if len(cmd)==0:continue
cmd_str=cmd.split()[0]
if hasattr(self,cmd_str):
func=getattr(self,cmd_str)
func(cmd)
else:
self.help()
def put(self,*args):
cmd_split=args[0].split()
if len(cmd_split)>1:
filename=cmd_split[1]
if os.path.isfile(filename):
filesize=os.stat(filename).st_size
msg_dic={
"action":"put",
"filename":filename,
"size":filesize,
"overridden":True
}
self.client.send(json.dumps(msg_dic).encode("utf-8"))
#防止粘包,等服务器确认
server_response=self.client.recv(1024)
f=open(filename,'rb')
for line in f:
self.client.send(line)
else:
print("file upload success...")
f.close()
else:
print(filename,"is not exist")
def get(self):
pass
ftp=FtpClient()
ftp.connect("localhost",6969)
ftp.interactive()
创建程序目录结构
Directory--->ftp_client
Directory--->ftp_server--->Pakage--->bin,core,conf,log
ftp_server--->Directory--->data
core
main.py
import socketserver,json,os
class MyTCPHandler(socketserver.BaseRequestHandler):
def put(self,*agrs):
'''接收客户端文件'''
cmd_dic=agrs[0] #取第一个参数,取传进来的func(cmd_dic)
filename=cmd_dic["filename"] #去字典的value
filesize=cmd_dic["size"]
if os.path.isfile(filename):
f=open(filename+'.new',"wb")
else:
f=open(filename,'wb')
self.request.send(b'200 ok') #返回客户端确认传文件码
received_size=0
while received_size<filesize:
data=self.request.recv(1024) #接收文件
f.write(data)
received_size+=len(data)
else:
print("file [%s] has uploaded..."%filename)
def handle(self):
while True:
try:
self.data = self.request.recv(1024).strip()
print("{} wrote:".format(self.client_address[0]))
print(self.data.decode())
cmd_dic=json.loads(self.data.decode())
print("cmd_dic:",cmd_dic)
action=cmd_dic["action"] #action就是cmd_dic["action"]取出来的put
if hasattr(self,action):
func=getattr(self,action) #调用def put
func(cmd_dic) #把cmd_dic的字典传给def put
except ConnectionResetError as e:
print("error:",e)
break
if __name__ == "__main__": #以下代码只在本脚本执行,作为模块在其他脚本不执行
HOST, PORT = "localhost", 6969
server = socketserver.ThreadingTCPServer((HOST,PORT),MyTCPHandler) #一个实例化的ThreadingTCPServer 支持多线程 Threading开启新线程
server.serve_forever() #处理多个请求,永远执行
server.allow_reuse_address() # 允许地址重用
socket_ftp上传实例
猜你喜欢
转载自blog.51cto.com/13707996/2336830
今日推荐
周排行