使用socket实现的ftp文件传输服务器

服务端:

 1 # encoding:utf-8
 2 # Author:"richie"
 3 # Date:8/23/2017
 4 
 5 from socket import *
 6 import pickle
 7 import os
 8 
 9 server=('127.0.0.1',17001)
10 root_path= os.path.abspath(os.curdir) # The absolute path of the current folder
11 sock = socket(AF_INET, SOCK_STREAM)
12 sock.bind(server)
13 sock.listen(5)
14 print('Wait for the client connection!!!')
15 while True: # Link cycle
16     conn, addr = sock.accept() #Waiting for client connection
17     print('Connect by',addr)
18     while True:    # Communication cycle
19         try:
20             data = conn.recv(1024) # Receive client data
21             if not data: break
22             filename = data.decode('utf-8') # Bytes -> String
23             file_path = os.path.join(root_path,filename) # join path
24             # get file size if file not existed file size is zero
25             file_size = os.path.getsize(file_path) if os.path.exists(file_path) else 0
26             header = pickle.pack('q', file_size)  # pack header
27             conn.send(header)   # send header
28             if file_size:   #The file exists and size than 0
29                 with open(file_path,'rb') as f:
30                     for line in f:
31                         conn.send(line)   # send line of file data
32             else:
33                 conn.send(b'')
34         except ConnectionResetError as e:  # conn abnormal
35             break
36         except Exception as e:
37             print(e)
38     conn.close()

 

客户端

 1 # encoding:utf-8
 2 # Author:"richie"
 3 # Date:8/23/2017
 4 
 5 from socket import *
 6 import pickle,sys
 7 import os
 8 def progress(percent,width=250):
 9     if percent >= 100:
10         percent=100
11     show_str=('[%%-%ds]' %width) %(int(width * percent / 100) * "#") #字符串拼接的嵌套使用
12     print("\r%s %d%%" %(show_str, percent),end='',file=sys.stdout,flush=True)
13 
14 server=('127.0.0.1',17001)
15 sock = socket(AF_INET,SOCK_STREAM)
16 sock.connect(server)
17 root_path= os.path.abspath(os.curdir) # The absolute path of the current folder
18 
19 while True:
20     print('The current home path is '+root_path)
21     filename = input('Please enter the path>>:').strip()
22     if not filename:continue
23     sock.send(filename.encode('utf-8'))
24     header = sock.recv(8) # Receive the header
25     total_size = pickle.unpack('q',header)[0] # get header data
26     each_recv_size = 1024*8421
27     recv_size = 0
28     recv_data = b''
29     down_filename = 'down_'+filename
30     f = open(down_filename,'wb')
31     while recv_size < total_size:
32         if total_size - recv_size < each_recv_size:
33             data = sock.recv(total_size - recv_size)
34         else:
35             data = sock.recv(each_recv_size)
36         recv_size += len(data)
37         recv_percent = int(100 * (recv_size / total_size))  # Receive the percent
38         progress(recv_percent, width=30)  # The width of the progress bar is 30
39         f.write(data)
40     print()
41     f.close()

 

posted @ 2017-08-24 11:38  Richie`  阅读(...)  评论(... 编辑 收藏