服务端
import socketserver, struct, json, os
IP = '127.0.0.1'
PORT = 8080
SERVER_ADD = (IP, PORT)
class MyTCPClass(socketserver.BaseRequestHandler):
def get_upload(self, hander):
file_size = hander['file_length']
res = b''
size = 0
while size < file_size:
date = self.request.recv(1024)
size += len(date)
res += date
# print(res.decode('utf-8'))
while True:
# tar_path = input('请输入指定目录:').strip()
tar_path = hander['tar_path']
if not os.path.isdir(tar_path):
# print('目录不存在')
return False, '服务器,目标目录不存在'
f_name = hander['file_name']
f_path = os.path.join(tar_path, f_name)
with open(f_path, 'w', encoding='utf-8')as f:
f.write(res.decode('utf-8'))
f.flush()
print('服务器-文件上传成功。')
return True, '文件上传成功'
def get_download(self, hander):
file_path = hander['file_path']
if not os.path.exists(file_path):
return False, '服务器,目标文件不存在'
file_name = (os.path.split(file_path))[1]
with open(file_path, 'r', encoding='utf-8')as f:
data = f.read()
size = len(data)
hander = {
'order': 'upload',
'file_name': file_name,
'file_length': size
}
hander_json = json.dumps(hander)
b_hander = hander_json.encode('utf-8')
s_hander = struct.pack('i', len(b_hander))
self.request.send(s_hander)
self.request.send(b_hander)
self.request.send(data.encode('utf-8'))
return True, '查询文件并返回'
def handle(self):
s_hander = self.request.recv(4)
b_hander = self.request.recv(struct.unpack('i', s_hander)[0])
hander = json.loads(b_hander.decode('utf-8'))
order = hander['order']
perform = {
'upload': self.get_upload,
'download': self.get_download,
}
res, msg = perform[order](hander)
print(msg)
b_msg = msg.encode('utf-8')
s_msg = struct.pack('i', len(b_msg))
self.request.send(s_msg)
self.request.send(b_msg)
if __name__ == '__main__':
server = socketserver.ThreadingTCPServer(SERVER_ADD, MyTCPClass)
server.serve_forever()
客户端
import socket, os, json, struct
IP = '127.0.0.1'
PORT = 8080
SERVER_ADD = (IP, PORT)
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(SERVER_ADD)
def choose_order():
while True:
order_dic = {
'1': 'upload',
'2': 'download',
}
for i in order_dic:
print(i, order_dic[i])
order_num = input('请输入操作指令:').strip()
# if order_num == 'q':
# return
if order_num not in order_dic:
print('请输入正确操作!')
continue
order = order_dic[order_num]
return order
def upload():
while True:
file_path = input('请输入文件路径>>').strip()
if not os.path.exists(file_path):
print('文件不存在')
continue
tar_path = input('请输入指定目录:').strip()
file_name = (os.path.split(file_path))[1]
with open(file_path, 'r', encoding='utf-8')as f:
data = f.read()
size = len(data)
hander = {
'order': 'upload',
'tar_path': tar_path,
'file_name': file_name,
'file_length': size
}
hander_json = json.dumps(hander)
b_hander = hander_json.encode('utf-8')
s_hander = struct.pack('i', len(b_hander))
client.send(s_hander)
client.send(b_hander)
client.send(data.encode('utf-8'))
s_res = client.recv(4)
res = client.recv(struct.unpack('i', s_res)[0])
res = res.decode('utf-8')
# print(res)
return res
def download():
while True:
file_path = input('请输入目标文件路径:').strip()
local_dir = input('请输入本地下载目录>>').strip()
if not os.path.isdir(local_dir):
print('目录不存在')
continue
hander = {
'order': 'download',
'file_path': file_path,
}
hander_json = json.dumps(hander)
b_hander = hander_json.encode('utf-8')
s_hander = struct.pack('i', len(b_hander))
client.send(s_hander)
client.send(b_hander)
server_hander_size = client.recv(4)
ser_hander = client.recv(struct.unpack('i', server_hander_size)[0])
ser_hander = json.loads(ser_hander.decode('utf-8'))
file_length = ser_hander['file_length']
res = b''
size = 0
while size < file_length:
date = client.recv(1024)
size += len(date)
res += date
file_name = ser_hander['file_name']
local_file = os.path.join(local_dir, file_name)
with open(local_file, 'w', encoding='utf-8')as f:
f.write(res.decode('utf-8'))
f.flush()
# print('客户端-文件下载成功。')
return '文件下载成功'
perform = {
'upload': upload,
'download': download
}
if __name__ == '__main__':
order = choose_order()
res = perform[order]()
print(res)