2023-03-22 网盘系统(老师的)

1.服务端目录

pan
|----main.py                             文件,程序的主文件
|----config                                包,放配置文件
      |----__init__.py
      |----settings.py
|----db                                      文件夹,存放用户信息数据,放user.xlsx
|----files                                    文件夹,存放文件
|----src                                      包,业务处理的代码            
      |----handlers
            |----__init__.py
            |----pan.py                    文件,实现注册,登录,上传,下载功能
      |----__init__.py
      |----select_server.py           文件,IO多路复用+非阻塞
      |----server.py                       文件,普通服务端
|----utils                                      包,公共功能
      |----__init__.py
      |----req.py                             文件,发送接收数据,发送接收文件,解决粘包问题

settings.py

HOST = "127.0.0.1"
PORT = 8000

server.py

import socket
from config import settings


class Server(object):
    def __init__(self):
        self.host = settings.HOST
        self.port = settings.PORT

    def run(self, handler):
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

        sock.bind((self.host, self.port))
        sock.listen(5)
        while True:
            conn, addr = sock.accept()
            print("有客户端来连接了")
            instance = handler(conn)
            while True:
                result = instance.execute()
                if not result:
                    print("客户端断开连接")
                    break
            conn.close()
        socket. Close()

pan.py

from utils import req


class PanHandler(object):
    def __init__(self, conn):
        self.username = None
        self.conn = conn

    def execute(self):
        """
        每次客户端发来请求,触发此方法。
        :return:  返回False 关闭连接;  返回True 继续执行
        """
        conn = self.conn
        cmd, *args = req.recv_data(conn).decode("utf-8")
        if cmd.upper == "Q":
            print("客户端退出")
            return False

req.py

import struct


def send_data(conn, content):
    data = content.encode("utf-8")
    header = struct.pack("i", len(data))
    conn.sendall(header)
    conn.sendall(data)


def recv_data(conn, chunk_size=1024):
    has_read_size = 0
    bytes_list = []
    while has_read_size < 4:
        chunk = conn.recv(4 - has_read_size)
        has_read_size += len(chunk)
        bytes_list.append(chunk)
    header = b"".join(bytes_list)
    data_length = struct.unpack("i", header)[0]

    has_read_data_size = 0
    data_list = []
    while has_read_data_size < data_length:
        size = chunk_size if (data_length - has_read_data_size) > chunk_size else data_length - has_read_data_size
        chunk = conn.recv(size)
        has_read_data_size += len(chunk)
        data_list.append(chunk)
    data = b"".join(data_list)
    return data

main.py

from src.handler.pan import PanHandler
from src.server import Server

if __name__ == "__main__":
    server = Server()
    server. Run(PanHandler)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容