zoukankan      html  css  js  c++  java
  • socket与socketserver实现简的ftp文件上传下载、断点续传功能

    1、配置文件

    IP_PORT = ('localhost', 50009)

    2、client文件

     1 import socket
     2 from config.settings import IP_PORT
     3 import os
     4 
     5 class FtpSocketClient(object):
     6     def __init__(self):
     7         self.ftpclient = socket.socket()
     8         self.ftpclient.connect(IP_PORT)
     9         server_reply = self.ftpclient.recv(1024)
    10         print(str(server_reply, encoding='utf-8'))
    11 
    12     def updata(self, path):
    13         """上传文件"""
    14         print('准备发送文件')
    15         file_size = os.path.getsize(path)
    16         data = '{0}|{1}|{2}'.format('accpet', path, file_size)
    17         self.ftpclient.send(bytes(data, encoding='utf-8'))
    18         server_reply = self.ftpclient.recv(1024)
    19         if str(server_reply, encoding='utf-8') == 'ok':
    20             size = 0
    21             with open('test.txt', 'rb') as f:
    22                 while size < file_size:
    23                     file_data = f.read(500)
    24                     self.ftpclient.send(file_data)
    25                     size += len(file_data)
    26                 else:
    27                     print('文件发送完成')
    28 
    29     def download(self, path):
    30         """下载文件"""
    31         if os.path.exists(path):
    32             with open(path, 'ab') as f:
    33                 p = f.tell()
    34                 data = '{0}|{1}|{2}'.format('recv', path, p)
    35                 self.ftpclient.sendall(bytes(data, encoding='utf-8'))
    36                 file_size = str(self.ftpclient.recv(1024), encoding='utf-8')
    37                 if p >= int(file_size):
    38                     print('文件已经完整存在')
    39                     return
    40                 else:
    41                     self.ftpclient.send(bytes('ok', encoding='utf-8'))
    42                     while f.tell() != int(file_size):
    43                         file_data = self.ftpclient.recv(500)
    44                         f.write(file_data)
    45                     else:
    46                         print('文件接收完成!')
    47         else:
    48             data = '{0}|{1}|{2}'.format('recv', path, 0)
    49             self.ftpclient.sendall(bytes(data, encoding='utf-8'))
    50             file_size = str(self.ftpclient.recv(1024), encoding='utf-8')
    51             with open(path, 'wb') as f:
    52                 self.ftpclient.send(bytes('ok', encoding='utf-8'))
    53                 size = 0
    54                 while size != int(file_size):
    55                     file_data = self.ftpclient.recv(500)
    56                     f.write(file_data)
    57                     size += len(file_data)
    58                 else:
    59                     print('文件接收完成!')
    60                     
    61     def close(self):
    62         self.ftpclient.close()
    63 
    64 
    65 
    66 if __name__ == '__main__':
    67     myClient = FtpSocketClient()
    68     # myClient.updata('test.txt')
    69     myClient.download('test.txt')
    70     myClient.close()

    3、server文件

     1 import socketserver
     2 from config.settings import IP_PORT
     3 import os
     4 
     5 
     6 
     7 
     8 class MyTCPHandler(socketserver.BaseRequestHandler):
     9     def handle(self):
    10         print('New Conn:', self.client_address)
    11         self.request.send(bytes('链接成功', 'utf-8'))
    12         while True:
    13             try:
    14                 data = self.request.recv(1024)
    15             except:
    16                 data = ''
    17             if not data:
    18                 break
    19             cmd_list = data.decode().split('|')
    20             if hasattr(MyTCPHandler, cmd_list[0]):
    21                 fun = getattr(MyTCPHandler, cmd_list[0])
    22                 fun(self, cmd_list[1:])
    23             else:
    24                  print('cmd is error')
    25 
    26     def accpet(self, file_info):
    27         """收文件"""
    28         with open(file_info[0], 'wb') as f:
    29             self.request.send(bytes('ok', encoding='utf-8'))
    30             size = 0
    31             while size != int(file_info[1]):
    32                 file_data = self.request.recv(500)
    33                 f.write(file_data)
    34                 size += len(file_data)
    35             else:
    36                 print('文件接收完成!')
    37 
    38 
    39     def recv(self, path):
    40         """发文件"""
    41         p = os.path.join(os.getcwd(), path[0])
    42         if os.path.exists(p):
    43             file_size = os.path.getsize(p)
    44             self.request.sendall(bytes(str(file_size), encoding='utf-8'))
    45             server_reply = self.request.recv(1024)
    46             if str(server_reply, encoding='utf-8') == 'ok':
    47                 size = int(path[1])
    48                 with open('test.txt', 'rb') as f:
    49                     f.seek(size)
    50                     while size < file_size:
    51                         file_data = f.read(500)
    52                         self.request.send(file_data)
    53                         size += len(file_data)
    54                     else:
    55                         print('文件发送完成')
    56         else:
    57             print('文件不存在')
    58 
    59 if __name__ == '__main__':
    60     server = socketserver.ThreadingTCPServer(IP_PORT, MyTCPHandler)
    61     server.serve_forever()
  • 相关阅读:
    区分服务器和客户端,玩家的控制权
    分割字符串
    switch语句的使用
    博客暂停使用
    [题解]洛谷P1041 传染病控制
    [题解]洛谷P2668 斗地主
    [题解]洛谷P4017 最大食物链计数
    [题解]洛谷P1983 车站分级
    [OI学习笔记]倍增LCA
    [OI学习笔记]st表
  • 原文地址:https://www.cnblogs.com/jp-mao/p/7042164.html
Copyright © 2011-2022 走看看