# Chat-Room 共享模块文档
## 📋 概述
共享模块(shared/)包含了客户端和服务器端共同使用的代码,包括通信协议、常量定义、异常处理、日志系统等。这些模块确保了系统的一致性和可维护性。
## 🏗️ 模块架构
### 共享模块组织结构
```mermaid
graph TB
subgraph "共享模块 (shared/)"
CONST[constants.py
常量定义]
MSG[messages.py
消息协议]
PROTO[protocol.py
通信协议]
EXC[exceptions.py
异常定义]
LOG[logger.py
日志系统]
CONFIG[config_manager.py
配置管理]
end
subgraph "客户端使用"
CLIENT[client模块]
end
subgraph "服务器端使用"
SERVER[server模块]
end
CONST --> CLIENT
CONST --> SERVER
MSG --> CLIENT
MSG --> SERVER
PROTO --> CLIENT
PROTO --> SERVER
EXC --> CLIENT
EXC --> SERVER
LOG --> CLIENT
LOG --> SERVER
CONFIG --> CLIENT
CONFIG --> SERVER
```
## 📡 通信协议模块
### 协议定义 (shared/protocol.py)
```python
class MessageProtocol:
"""消息协议处理器"""
VERSION = "1.0"
ENCODING = "utf-8"
MAX_MESSAGE_SIZE = 1024 * 1024 # 1MB
@staticmethod
def encode_message(message_type: str, data: dict, request_id: str = None) -> bytes:
"""编码消息为网络传输格式"""
@staticmethod
def decode_message(raw_data: bytes) -> dict:
"""解码网络消息"""
@staticmethod
def validate_message(message: dict) -> bool:
"""验证消息格式"""
```
### 消息格式标准
```mermaid
graph TD
subgraph "消息结构"
MSG[消息对象]
TYPE[type: 消息类型]
DATA[data: 消息数据]
TIME[timestamp: 时间戳]
ID[request_id: 请求ID]
VER[version: 协议版本]
end
MSG --> TYPE
MSG --> DATA
MSG --> TIME
MSG --> ID
MSG --> VER
subgraph "消息类型分类"
AUTH[认证消息
login, register]
CHAT[聊天消息
chat, system]
FILE[文件消息
upload, download]
AI_MSG[AI消息
ai_request, ai_response]
CTRL[控制消息
ping, pong, error]
end
```
### 消息类型定义 (shared/messages.py)
```python
class MessageType:
"""消息类型常量"""
# 认证相关
LOGIN_REQUEST = "login_request"
LOGIN_RESPONSE = "login_response"
REGISTER_REQUEST = "register_request"
REGISTER_RESPONSE = "register_response"
LOGOUT_REQUEST = "logout_request"
# 聊天相关
CHAT_MESSAGE = "chat_message"
SYSTEM_MESSAGE = "system_message"
USER_JOINED = "user_joined"
USER_LEFT = "user_left"
# 聊天组相关
CREATE_GROUP_REQUEST = "create_group_request"
CREATE_GROUP_RESPONSE = "create_group_response"
JOIN_GROUP_REQUEST = "join_group_request"
JOIN_GROUP_RESPONSE = "join_group_response"
# 文件传输相关
FILE_UPLOAD_REQUEST = "file_upload_request"
FILE_UPLOAD_RESPONSE = "file_upload_response"
FILE_DOWNLOAD_REQUEST = "file_download_request"
FILE_DOWNLOAD_RESPONSE = "file_download_response"
FILE_LIST_REQUEST = "file_list_request"
FILE_LIST_RESPONSE = "file_list_response"
# AI相关
AI_REQUEST = "ai_request"
AI_RESPONSE = "ai_response"
# 控制相关
PING = "ping"
PONG = "pong"
ERROR = "error"
HEARTBEAT = "heartbeat"
class Message:
"""消息数据结构"""
def __init__(self, message_type: str, data: dict = None, request_id: str = None):
self.type = message_type
self.data = data or {}
self.timestamp = datetime.now().isoformat()
self.request_id = request_id or self._generate_id()
self.version = MessageProtocol.VERSION
def to_dict(self) -> dict:
"""转换为字典格式"""
@classmethod
def from_dict(cls, data: dict) -> 'Message':
"""从字典创建消息对象"""
def _generate_id(self) -> str:
"""生成唯一请求ID"""
```
## 🔧 常量定义模块
### 系统常量 (shared/constants.py)
```python
# 网络配置常量
DEFAULT_HOST = "localhost"
DEFAULT_PORT = 8888
MAX_CONNECTIONS = 100
SOCKET_TIMEOUT = 30
BUFFER_SIZE = 4096
# 用户相关常量
MIN_USERNAME_LENGTH = 3
MAX_USERNAME_LENGTH = 20
MIN_PASSWORD_LENGTH = 6
MAX_PASSWORD_LENGTH = 50
SESSION_TIMEOUT = 3600 # 1小时
# 聊天组相关常量
MAX_GROUP_NAME_LENGTH = 50
MAX_GROUP_MEMBERS = 100
DEFAULT_GROUP_NAME = "公频"
# 文件传输常量
MAX_FILE_SIZE = 10 * 1024 * 1024 # 10MB
ALLOWED_FILE_TYPES = [
".txt", ".pdf", ".doc", ".docx", ".xls", ".xlsx",
".jpg", ".jpeg", ".png", ".gif", ".bmp",
".zip", ".rar", ".7z", ".tar", ".gz"
]
UPLOAD_CHUNK_SIZE = 8192
DOWNLOAD_TIMEOUT = 60
# AI相关常量
AI_USER_ID = -1
AI_USERNAME = "AI助手"
AI_MAX_CONTEXT_LENGTH = 10
AI_RESPONSE_TIMEOUT = 30
# 消息相关常量
MAX_MESSAGE_LENGTH = 2000
MAX_CHAT_HISTORY = 1000
MESSAGE_BATCH_SIZE = 50
# 状态常量
class UserStatus:
ONLINE = "online"
OFFLINE = "offline"
AWAY = "away"
BUSY = "busy"
class GroupType:
PUBLIC = "public"
PRIVATE = "private"
class MessageStatus:
SENT = "sent"
DELIVERED = "delivered"
READ = "read"
FAILED = "failed"
```
### 配置路径常量
```python
# 配置文件路径
SERVER_CONFIG_PATH = "config/server_config.yaml"
CLIENT_CONFIG_PATH = "config/client_config.yaml"
# 数据存储路径
DATABASE_PATH = "server/data/chatroom.db"
LOG_DIR = "logs"
UPLOAD_DIR = "server/data/files/uploads"
DOWNLOAD_DIR = "client/Downloads"
# 主题文件路径
THEME_DIR = "client/ui/themes"
DEFAULT_THEME = "default.css"
```
## ❌ 异常处理模块
### 异常类定义 (shared/exceptions.py)
```python
class ChatRoomException(Exception):
"""Chat-Room基础异常类"""
def __init__(self, message: str, error_code: int = None):
super().__init__(message)
self.message = message
self.error_code = error_code
self.timestamp = datetime.now()
class NetworkException(ChatRoomException):
"""网络相关异常"""
pass
class AuthenticationException(ChatRoomException):
"""认证相关异常"""
pass
class UserException(ChatRoomException):
"""用户相关异常"""
pass
class ChatGroupException(ChatRoomException):
"""聊天组相关异常"""
pass
class FileTransferException(ChatRoomException):
"""文件传输相关异常"""
pass
class AIException(ChatRoomException):
"""AI功能相关异常"""
pass
class DatabaseException(ChatRoomException):
"""数据库相关异常"""
pass
class ConfigurationException(ChatRoomException):
"""配置相关异常"""
pass
```
### 异常处理流程
```mermaid
flowchart TD
ERROR[异常发生] --> CATCH[捕获异常]
CATCH --> LOG[记录日志]
LOG --> CLASSIFY{异常分类}
CLASSIFY -->|网络异常| NET_HANDLE[网络异常处理]
CLASSIFY -->|认证异常| AUTH_HANDLE[认证异常处理]
CLASSIFY -->|业务异常| BIZ_HANDLE[业务异常处理]
CLASSIFY -->|系统异常| SYS_HANDLE[系统异常处理]
NET_HANDLE --> RETRY{是否重试?}
RETRY -->|是| RECONNECT[重新连接]
RETRY -->|否| USER_MSG[用户提示]
AUTH_HANDLE --> USER_MSG
BIZ_HANDLE --> USER_MSG
SYS_HANDLE --> USER_MSG
RECONNECT --> SUCCESS{连接成功?}
SUCCESS -->|是| CONTINUE[继续执行]
SUCCESS -->|否| USER_MSG
USER_MSG --> END[异常处理完成]
CONTINUE --> END
```
## 📝 日志系统模块
### 日志管理器 (shared/logger.py)
```python
class LoggerManager:
"""日志管理器"""
def __init__(self):
self.loggers = {}
self.config = None
def init_logger(self, config: dict, component: str = "default"):
"""初始化日志系统"""
def get_logger(self, name: str) -> logging.Logger:
"""获取指定名称的日志器"""
def setup_file_handler(self, logger: logging.Logger, config: dict):
"""设置文件日志处理器"""
def setup_console_handler(self, logger: logging.Logger, config: dict):
"""设置控制台日志处理器"""
```
### 日志配置结构
```mermaid
graph TB
subgraph "日志系统架构"
MANAGER[LoggerManager
日志管理器]
subgraph "日志器"
ROOT[root
根日志器]
SERVER[server
服务器日志器]
CLIENT[client
客户端日志器]
DB[database
数据库日志器]
AI[ai
AI日志器]
end
subgraph "处理器"
FILE[FileHandler
文件处理器]
CONSOLE[ConsoleHandler
控制台处理器]
ROTATE[RotatingFileHandler
轮转文件处理器]
end
subgraph "格式器"
DETAILED[详细格式器]
SIMPLE[简单格式器]
JSON[JSON格式器]
end
end
MANAGER --> ROOT
MANAGER --> SERVER
MANAGER --> CLIENT
MANAGER --> DB
MANAGER --> AI
ROOT --> FILE
SERVER --> ROTATE
CLIENT --> CONSOLE
FILE --> DETAILED
ROTATE --> JSON
CONSOLE --> SIMPLE
```
### 日志级别和分类
```python
class LogLevel:
"""日志级别常量"""
DEBUG = "DEBUG"
INFO = "INFO"
WARNING = "WARNING"
ERROR = "ERROR"
CRITICAL = "CRITICAL"
class LogCategory:
"""日志分类常量"""
NETWORK = "network"
DATABASE = "database"
AUTH = "auth"
CHAT = "chat"
FILE = "file"
AI = "ai"
PERFORMANCE = "performance"
SECURITY = "security"
```
## ⚙️ 配置管理模块
### 配置管理器 (shared/config_manager.py)
```python
class ConfigManager:
"""统一配置管理器"""
def __init__(self, config_path: str):
self.config_path = config_path
self.config = {}
self.watchers = []
def load_config(self) -> dict:
"""加载配置文件"""
def get(self, key: str, default=None):
"""获取配置值(支持点号分隔的嵌套键)"""
def set(self, key: str, value):
"""设置配置值"""
def save(self):
"""保存配置到文件"""
def watch(self, callback):
"""监听配置变化"""
def validate_config(self, schema: dict) -> bool:
"""验证配置格式"""
```
### 配置验证模式
```mermaid
graph TD
CONFIG[配置文件] --> LOAD[加载配置]
LOAD --> VALIDATE[配置验证]
VALIDATE --> SCHEMA[检查模式]
SCHEMA --> TYPE[类型验证]
TYPE --> RANGE[范围验证]
RANGE --> REQUIRED[必填验证]
REQUIRED --> VALID{验证通过?}
VALID -->|是| APPLY[应用配置]
VALID -->|否| ERROR[配置错误]
ERROR --> LOG_ERROR[记录错误]
LOG_ERROR --> DEFAULT[使用默认值]
DEFAULT --> APPLY
APPLY --> NOTIFY[通知监听器]
NOTIFY --> COMPLETE[配置完成]
```
## 🔒 安全工具模块
### 数据验证工具
```python
class Validator:
"""数据验证工具类"""
@staticmethod
def validate_username(username: str) -> Tuple[bool, str]:
"""验证用户名格式"""
@staticmethod
def validate_password(password: str) -> Tuple[bool, str]:
"""验证密码强度"""
@staticmethod
def validate_filename(filename: str) -> Tuple[bool, str]:
"""验证文件名安全性"""
@staticmethod
def sanitize_input(text: str) -> str:
"""清理用户输入"""
@staticmethod
def validate_file_type(filename: str) -> bool:
"""验证文件类型"""
```
### 加密工具
```python
class CryptoUtils:
"""加密工具类"""
@staticmethod
def hash_password(password: str) -> str:
"""密码哈希"""
@staticmethod
def verify_password(password: str, hashed: str) -> bool:
"""验证密码"""
@staticmethod
def generate_token(length: int = 32) -> str:
"""生成随机令牌"""
@staticmethod
def encrypt_data(data: str, key: str) -> str:
"""数据加密"""
@staticmethod
def decrypt_data(encrypted_data: str, key: str) -> str:
"""数据解密"""
```
## 🧪 测试工具模块
### 测试辅助工具
```python
class TestUtils:
"""测试辅助工具"""
@staticmethod
def create_test_message(message_type: str, data: dict = None) -> Message:
"""创建测试消息"""
@staticmethod
def create_test_user(username: str = "test_user") -> dict:
"""创建测试用户"""
@staticmethod
def create_test_group(name: str = "test_group") -> dict:
"""创建测试聊天组"""
@staticmethod
def mock_socket_connection():
"""模拟Socket连接"""
@staticmethod
def generate_test_file(size: int = 1024) -> bytes:
"""生成测试文件数据"""
```
这个共享模块文档详细说明了Chat-Room项目中所有共享组件的设计和实现,确保了客户端和服务器端的一致性和可维护性。