作业20200421
项目结构
我的作业/
|-- data_server # 服务端文件夹
|-- data-client # 客户端文件夹
|-- server.py # 服务端程序
|-- client.py # 客户度程序
server.py
import os, json, struct
import socketserver
class SbFtpServer:
base_dir = os.path.dirname(__file__)
def download(self, cmd_info, request):
file_path = os.path.join(self.base_dir, 'data_server', cmd_info[1])
data_dict = {
'total_size': os.path.getsize(file_path),
'file_name': cmd_info[1]
}
data_header = json.dumps(data_dict).encode('utf-8')
data_header_len = struct.pack('i', len(data_header))
print(data_header_len)
request.send(data_header_len)
request.send(data_header)
with open(file_path, 'rb') as f:
for line in f:
request.send(line)
def upload(self):
pass
class MyTcpRequestHandle(socketserver.BaseRequestHandler):
def handle(self):
while 1:
try:
cmd_info = self.request.recv(1024).decode('utf-8')
if not cmd_info: break
cmd_info = cmd_info.split()
obj_ftp = SbFtpServer()
if hasattr(obj_ftp, cmd_info[0]):
getattr(obj_ftp, cmd_info[0])(cmd_info, self.request)
except Exception as e:
print(e)
break
self.request.close()
s = socketserver.ThreadingTCPServer(('127.0.0.1', 8080), MyTcpRequestHandle)
s.serve_forever()
client.py
import socket
import json, struct, os
client = socket.socket(-1, -1)
client.connect(('127.0.0.1', 8080))
while 1:
cmd = input('>>>:').strip().encode('utf-8')
if cmd == 'q':
break
if not cmd: continue
client.send(cmd)
data_header_len = struct.unpack('i', client.recv(4))[0]
data_dict = json.loads(client.recv(data_header_len).decode('utf-8'))
total_size = data_dict.get('total_size')
file_name = data_dict.get('file_name')
recv_size = 0
file_path = os.path.join('data_client', file_name)
with open(file_path, 'wb') as f:
while recv_size < total_size:
data = client.recv(1024)
f.write(data)
recv_size += len(data)
client.close()

浙公网安备 33010602011771号