4.21
目录
作业
编写cs架构的软件,实现客户端可以下载服务端的文件,如图片、视频、文本等
#客户端
import socketserver
import os
import json
import struct
class MyRequesthandle(socketserver.BaseRequestHandler):
def handle(self):
while True:
try:
size = 0
file_msg = ''
msg = self.request.recv(1024)
if len(msg) == 0: break
msg_list = msg.decode('utf-8').split()
cmd = msg_list[0]
file_1 = msg_list[1]
file_2 = msg_list[2]
file = f'{file_1} {file_2}'
if os.path.exists(file):
if cmd == 'get':
with open(file, 'rb')as f:
for line in f:
size += len(line)
file_msg += str(line)
else:
file_msg = '输错了'
size = len(file_msg)
else:
file_msg = '输错了'
size = len(file_msg)
head_dic = {"filename": file,"total_size": size}
json_str = json.dumps(head_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)
file_msg = file_msg.encode('utf-8')
self.request.send(file_msg)
except Exception:break
self.request.close()
s=socketserver.ThreadingTCPServer(('127.0.0.1',8080),MyRequesthandle)
s.serve_forever()
# 服务端
import subprocess,os,struct,json
from socket import *
server=socket(AF_INET,SOCK_STREAM)
server.bind(('127.0.0.1',8080))
server.listen(4)
while True:
conn,client_addr=server.accept()
while True:
try:
size = 0
file_msg = ""
msg=conn.recv(1024)
if len(msg) == 0:
break
msg_list=msg.decode('utf-8').split()
cmd=msg_list[0]
file_1=msg_list[1]
file_2=msg_list[2]
file=f'{file_1} {file_2}'
if os.path.exists(file):
if cmd =='get':
with open(file, 'rb')as f:
for line in f:
size+=len(line)
file_msg+=str(line)
else:
file_msg = ''
size = len(file_msg)
else:
file_msg='输错了'
size=len(file_msg)
head_dic={"filename":file,"total_size":size,}
json_str = json.dumps(head_dic)
json_str_bytes = json_str.encode('utf-8')
x=struct.pack('i',len(json_str_bytes))
conn.send(x)
conn.send(json_str_bytes)
file_msg=file_msg.encode('utf-8')
conn.send(file_msg)
except Exception:break
conn.close()