socket_ftp上传实例

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()  # 允许地址重用

猜你喜欢

转载自blog.51cto.com/13707996/2336830
今日推荐