4.21作业
作业:
编写cs架构的软件,实现客户端可以下载服务端的文件,如图片、视频、文本等
服务端:
import socketserver
import os
import json
import struct
class MyRequestHandler(socketserver.BaseRequestHandler):
def handle(self):
print(self.client_address)
while True:
try:
file_data = self.request.recv(1024)
if len(file_data) == 0: break
file_name = file_data.decode('utf-8')
BASE_SERVER_DIR = r'C:\Users\asus\PycharmProjects\正课\day36\作业'
LOAD_PATH = os.path.join(BASE_SERVER_DIR, file_name)
total_size = os.path.getsize(LOAD_PATH)
header_dic = {
"filename": file_name,
"total_size": total_size,
}
json_str = json.dumps(header_dic)
json_str_bytes = json_str.encode('utf-8')
x = struct.pack('i', len(json_str_bytes))
self.request.send(x)
self.request.send(json_str_bytes)
with open(LOAD_PATH, mode='rb') as f:
for line in f:
self.request.send(line)
except Exception:
break
self.request.close()
s = socketserver.ThreadingTCPServer(('127.0.0.1', 8081), MyRequestHandler)
s.serve_forever()
客户端:
import struct
import json
from socket import *
client = socket(AF_INET, SOCK_STREAM)
client.connect(('127.0.0.1', 8081))
while True:
file_name = input('请输入下载的文件名>>:').strip()
if len(file_name) == 0: continue
client.send(file_name.encode('utf-8'))
x = client.recv(4)
header_len = struct.unpack('i', x)[0]
json_str_bytes = client.recv(header_len)
json_str = json_str_bytes.decode('utf-8')
header_dic = json.loads(json_str)
print(header_dic)
total_size = header_dic["total_size"]
recv_size = 0
while recv_size < total_size:
recv_data = client.recv(1024)
recv_size += len(recv_data)
with open(file_name, mode='ab') as f:
f.write(recv_data)