# socket-py **Repository Path**: fkly/socket-py ## Basic Information - **Project Name**: socket-py - **Description**: 端对端式终端聊天室 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-08-25 - **Last Updated**: 2024-08-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # socket-py #### 介绍 端对端式终端聊天室 #### 软件架构 软件架构说明 #### 安装教程 1. xxxx 2. xxxx 3. xxxx #### 使用说明 > 未完结 用python写socket工具类 实例化类提供ip自定义端口 两端保持长连接 服务端每接收一个客户端连接都为一个子线程 两端均可互发信息并打印返回结果 客户端在命令行交互可以 发送消息,清屏,退出,查看帮助 服务端在命令行交互可以 清屏,退出,查看帮助,查看连接列表,广播消息,给单个发消息 连接列表多显示登录时间 分成两个文件写 ,用中文注释 迭代完成服务端和客户端的命令行界面开发和完善直至无错误 用python写超长文本加密工具类 实例化类提供原始32位密钥 利用aes进行加密解密 进行数字签名,解密必须通过验证才能返回结果 迭代完成开发完善和寻错直至无错误 ``` python # 配置文件加载 def load_config(config_path='config.json'): with open(config_path, 'r', encoding='utf-8') as f: return json.load(f) # 日志配置 def setup_logging(config): log_level = getattr(logging, config.get('log_level', 'INFO').upper(), logging.INFO) logging.basicConfig(filename=config['log_file'], level=log_level, format='%(asctime)s - %(levelname)s - %(message)s', encoding='utf-8') # 显式设置编码为 UTF-8 ``` ```python def handle_client(self, client_socket, client_address): try: while True: try: # 尝试接收数据,不再设置超时 data = client_socket.recv(1024) if not data: # 如果没有接收到数据,打印消息后退出循环 logging.info(f"客户端 {client_address} 已断开连接") break message = data.decode('utf-8').strip() logging.info(f"收到来自 {client_address} 的消息: {message}") # 处理接收到的消息 except socket.timeout: # 如果发生超时,打印消息后继续循环 logging.info(f"与 {client_address} 的通信超时,但客户端未断开连接。") continue except Exception as e: logging.error(f"与客户端 {client_address} 通信出错: {e}") finally: # 确保客户端连接最终被关闭 if client_socket: client_socket.close() self.clients.pop(client_address, None) logging.info(f"客户端 {client_address} 的处理线程已结束") ``` ```python def shutdown(self): """关闭服务器,释放资源""" logging.info("正在关闭服务器...") for client_address, client_socket in list(self.clients.items()): try: client_socket.shutdown(socket.SHUT_RDWR) client_socket.close() except socket.error as e: logging.error(f"关闭客户端 {client_address} 连接时出错: {e}") self.server_socket.shutdown(socket.SHUT_RDWR) self.server_socket.close() logging.info("服务器已完全关闭。") ```