Python中为多Socket命名并按端口接收数据保存至对应文件
解决方案:多端口Socket数据分文件存储
核心问题分析
- 原代码无法关联客户端连接与对应监听端口,导致数据无法写入正确文件
- 存在变量作用域错误:
client_socket为局部变量,接收数据阶段引用逻辑混乱 - 缺少监听端口与客户端连接的映射关系,无法区分不同端口的数据流
修复后的完整代码
import select import socket import root_directory from Account import Symbols s = Symbols.Symbols() symbol_total = len(s.Symbol()) ports_list = list(range(9000, 9000 + symbol_total)) # 维护两个映射关系:监听Socket→端口,客户端Socket→对应监听端口 listen_sock_map = {} client_sock_map = {} def make_socket(port): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 修正bind参数:需传入(绑定地址, 端口)元组 sock.bind(('0.0.0.0', port)) sock.listen(5) listen_sock_map[sock] = port return sock # 初始化所有监听Socket read_list = [make_socket(port) for port in ports_list] while True: readable, writable, errored = select.select(read_list, [], []) for sock in readable: # 处理新连接:当前Socket是监听Socket if sock in listen_sock_map: client_socket, address = sock.accept() # 记录该客户端连接对应的监听端口 client_sock_map[client_socket] = listen_sock_map[sock] read_list.append(client_socket) else: # 处理客户端数据传输 try: data = sock.recv(1000000) if not data: # 客户端断开连接,清理资源 sock.close() read_list.remove(sock) del client_sock_map[sock] continue # 解码数据并写入对应端口的文件 content = data.decode("utf-8") target_port = client_sock_map[sock] with open(f"port_{target_port}.txt", "a", encoding="utf-8") as f: f.write(content + "\n") except Exception as e: print(f"数据处理出错: {e}") sock.close() if sock in read_list: read_list.remove(sock) if sock in client_sock_map: del client_sock_map[sock]
关键修复说明
- 修正bind参数:原代码
sock.bind('', number)语法错误,需传入('0.0.0.0', port)元组才能正确绑定端口 - 添加映射字典:通过两个字典建立Socket与端口的关联,确保每个客户端连接能追溯到对应的监听端口
- 修复变量逻辑:直接使用循环中的
sock处理客户端数据,避免原代码中client_socket的作用域混乱 - 实现分文件存储:根据客户端连接对应的端口,将数据追加写入
port_xxxx.txt文件,确保数据与端口一一对应 - 完善异常处理:捕获数据传输中的异常,避免单个连接出错导致整个服务崩溃
内容的提问来源于stack exchange,提问作者Kobs
相关产品推荐
相关产品推荐

