作业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()
posted @ 2020-04-21 20:46  the3times  阅读(12)  评论(0)    收藏  举报