温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

socket_ftp_上传下载

发布时间:2020-10-17 12:38:12 阅读:320 作者:leiwenbin627 栏目:编程语言
开发者测试专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

#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<filesize:
            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 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()

#client.py 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 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()

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI

开发者交流群×