|
#服务端
import socket
import os
import json
import struct
SHARE_DIR=r'F:\SHARE' #目标文件路径
class FtpServer:
def __init__(self,host,port):
self.host=host
self.port=port
self.server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
self.server.bind((self.host,self.port))
self.server.listen(5)
def serve_forever(self):
print('server starting...')
while True:
self.conn,self.client_addr=self.server.accept()
print(self.client_addr)
while True:
try:
data=self.conn.recv(1024) #params_json.encode('utf-8')
if not data:break
params=json.loads(data.decode('utf-8')) #params=['get','a.txt']
cmd=params[0]
if hasattr(self,cmd):
func=getattr(self,cmd)
func(params)
else:
print('\033[45mcmd not exists\033[0m')
except ConnectionResetError:
break
self.conn.close()
self.server.close()
def get(self,params): #params=['get','a.txt']
filename=params[1] #filename='a.txt'
filepath=os.path.join(SHARE_DIR,filename)
if os.path.exists(filepath):
headers = { #制作报头
'filename': filename,
'md5': '123sxd123x123',
'filesize': os.path.getsize(filepath)
}
headers_json = json.dumps(headers)
headers_bytes = headers_json.encode('utf-8')
self.conn.send(struct.pack('i',len(headers_bytes))) #先发报头的长度
self.conn.send(headers_bytes) #发送报头
with open(filepath,'rb') as f: #发送真实的数据
for line in f:
self.conn.send(line)
def put(self):
pass
if __name__ == '__main__':
server=FtpServer('127.0.0.1',8081)
server.serve_forever()
##客户端
import socket
import struct
import json
import os
DOWNLOAD_DIR=r'F:\DOWNLOAD' #下载路径
class FtpClient:
def __init__(self,host,port):
self.host=host
self.port=port
self.client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
self.client.connect((self.host,self.port))
def interactive(self):
while True:
data=input('>>: ').strip() #get a.txt
if not data:continue
params=data.split() #parmas=['get','a.txt']
cmd=params[0] #cmd='get'
if hasattr(self,cmd):
func=getattr(self,cmd)
func(params) #func(['get','a.txt'])
def get(self,params):
params_json=json.dumps(params)
self.client.send(params_json.encode('utf-8'))
headers_size = struct.unpack('i', self.client.recv(4))[0] #接收报头长度
headers_bytes = self.client.recv(headers_size) #接收报头
headers_json = headers_bytes.decode('utf-8')
headers_dic = json.loads(headers_json)
# print('========>', headers_dic)
filename = headers_dic['filename']
filesize = headers_dic['filesize']
filepath = os.path.join(DOWNLOAD_DIR, filename)
with open(filepath, 'wb') as f: #接收真实数据
recv_size = 0
while recv_size < filesize:
line = self.client.recv(1024)
recv_size += len(line)
f.write(line)
print('===>下载成功')
if __name__ == '__main__':
client=FtpClient('127.0.0.1',8081)
client.interactive() |
|
|