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()
原文地址:https://www.cnblogs.com/jp-mao/p/7042164.html