socket_ftp上传下载路径查文件
admin
2023-07-14 11:04:22
0次

#client
import socket,os,json,hashlib
class Ftpclient(object):
     def __init__(self):
         self.client=socket.socket()
     def help(self):
         print("put/get/cd/pwd")
     def connect(self,ip,port):
         self.client.connect((ip,port))
     def interactive(self):
         while True:
             cmd=input("请输入要上传下载的文件:").strip()
             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 pwd(self,*args):
         while True:
             cmd_split = args[0].split()
             if len(cmd_split) > 0:
                 msg_dic = {
                     "action": "pwd"
                 }
                 self.client.send(json.dumps(msg_dic).encode("utf-8"))
                 cmd_res = self.client.recv(1024)  # 收102400字节数据
                 self.client.send(b"ready recive result")
                 data=self.client.recv(1024)
                 print(data.decode())
                 break

     def dir(self,*args):
         cmd_split = args[0].split()
         if len(cmd_split)>0:
             msg_dic={
                 "action":"dir"
             }
             while True:
                 self.client.send(json.dumps(msg_dic).encode("utf-8"))
                 cmd_res = self.client.recv(1024)  # 收102400字节数据
                 cmd_res_size=int(cmd_res.decode("utf-8"))
                 self.client.send(b"ready recive result")
                 received_size=0
                 received_data=b''
                 while received_size
                     if cmd_res_size - received_size >1024:
                         size=1024
                     else:
                         size=cmd_res_size - received_size
                     data=self.client.recv(size)
                     received_size +=len(data)
                     received_data +=data
                 else:
                     print("cmd_res_size",cmd_res_size)
                     print(received_data.decode())
                 break
     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)
                 m=hashlib.md5()
                 f=open(filename,'rb')
                 for line in f:
                     m.update(line)
                     self.client.send(line)
                 else:
                     print("file md5:", m.hexdigest())
                     self.client.recv(1024)
                     self.client.send(m.hexdigest().encode("utf-8"))
                     print("file upload success...")
                     f.close()
             else:
                 print(filename,"is not exist")
     def get(self,*args):
         cmd_split=args[0].split()
         if len(cmd_split)>1:
             filename=cmd_split[1]
             msg_dic={
                     "action":"get",
                     "filename":filename,
                     "overridden":True
             }
             self.client.send(json.dumps(msg_dic).encode("utf-8"))
             received_size = 0
             m = hashlib.md5()
             f=open(filename+".download",'wb')
             server_response=self.client.recv(1024)
             file_total_size=int(server_response.decode())
             self.client.send(b"ready to recv file")
             while received_size < file_total_size:
                 if file_total_size - received_size > 1024:
                     size=1024
                 else:
                     size=file_total_size - received_size
                 data = self.client.recv(size)
                 m.update(data)
                 f.write(data)
                 received_size += len(data)
             else:
                 download_file_md5 = m.hexdigest()
                 self.client.send(b"ready recive your md5")
                 servrer_file_md5 = self.client.recv(1024)
                 print("server_file_md5:",servrer_file_md5.decode())
                 print("download_file_md5:",download_file_md5)
                 print("file [%s] has download..."%filename)
                 print("源文件和下载文件大小分别为:",received_size,file_total_size)
ftp=Ftpclient()
ftp.connect("localhost",5566)
ftp.interactive()

 

#main.py
import socketserver,json,os,hashlib
class MyTcpHandler(socketserver.BaseRequestHandler):
    def put(self,*args):
        cmd_dic=args[0]
        filename=cmd_dic["filename"]
        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
        m=hashlib.md5()
        while received_size
            data=self.request.recv(1024)
            m.update(data)
            f.write(data)
            received_size+=len(data)
        else:
            uploaded_file_md5=m.hexdigest()
            self.request.send(b"ready recive your md5")
            client_file_md5=self.request.recv(1024)
            print("client_file_md5:",client_file_md5.decode())
            print("uploaded_file_md5:",uploaded_file_md5)
            print("file [%s] has uploaded..."%filename)
    def get(self,*args):
        cmd_dic=args[0]
        filename=cmd_dic["filename"]
        if os.path.isfile(filename):
            f=open(filename,'rb')
            filesize=os.stat(filename).st_size
            self.request.send(str(filesize).encode())
            self.request.recv(1024)
            m = hashlib.md5()
            for line in f:
                m.update(line)
                self.request.send(line)
            else:
                print("file md5:", m.hexdigest())
                self.request.recv(1024)
                self.request.send(m.hexdigest().encode("utf-8"))
                print("file download  success...")
                f.close()
        else:
            print(filename,"is not exist")
    def dir(self,*args):
        cmd_dic = args[0]
        cmd=cmd_dic["action"]
        while True:
            res = os.popen(cmd).read()
            self.request.send(str(len(res.encode())).encode("utf-8"))
            client_ack=self.request.recv(1024)
            print("确认客户端接收信息")
            self.request.send(res.encode())
            print("执行结果已经发送")

    def pwd(self,*args):
        cmd_dic = args[0]
        cmd=cmd_dic["action"]
        while True:
            res = os.getcwd()
            self.request.send(str(len(res.encode())).encode("utf-8"))
            client_ack=self.request.recv(1024)
            print("确认客户端接收信息")
            self.request.send(res.encode())
            print("执行结果已经发送")

    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"]
                if hasattr(self,action):
                    func=(getattr(self,action))
                    func(cmd_dic)
            except ConnectionResetError as e:
                print("error",e)
                break
if __name__=="__main__":
    HOST,PORT="localhost",5566
    server=socketserver.ThreadingTCPServer((HOST,PORT),MyTcpHandler)
    server.serve_forever()
    server.allow_reuse_address()

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...