You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 11:22:36