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

Python重置socket连接且不终止服务运行脚本的方案咨询

解决方法

问题根因

你当前的代码存在两个核心缺陷导致无法复用地址接收新连接:

  • 仅执行了1次accept(),处理完单个客户端连接后程序无后续逻辑,直接结束运行
  • 未配置SO_REUSEADDR端口复用选项,TCP连接断开后短时间内端口会被TIME_WAIT状态占用,无法重新绑定

修正后代码

import socket

HOST = '192.168.8.21'
PORT = 12345

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    # 开启端口复用,解决TIME_WAIT状态导致的端口占用问题
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    s.bind((HOST, PORT))
    s.listen()
    print(f"服务端已启动,监听 {HOST}:{PORT}")
    # 外层循环,持续接收新的客户端连接
    while True:
        conn, addr = s.accept()
        with conn:
            print(f"已建立连接:{addr}")
            # 处理当前连接的数据流
            while True:
                data = conn.recv(1024)
                # 收到空数据说明客户端主动断开连接
                if not data:
                    print(f"连接已断开:{addr},等待新连接接入")
                    break
                print(data.decode('ascii'))

改动说明

  1. 端口复用配置:setsockopt添加的SO_REUSEADDR参数允许端口在TIME_WAIT状态下被重新绑定,不需要等待2MSL超时时间
  2. 外层监听循环:将accept()放入死循环中,单个连接断开后会自动回到监听状态,等待下一个客户端接入
  3. 断开检测逻辑:新增if not data判断,检测到客户端断开后主动退出当前连接的处理循环,避免无限打印空内容

修改完成后,每次执行nc 192.168.8.21 12345 < data.txt发送完数据断开连接后,服务端会自动恢复监听状态,无需重启脚本即可接收下一次连接。如果需要同时处理多个并行连接,可以进一步引入多线程/异步IO逻辑。

内容的提问来源于stack exchange,提问作者HugoSab

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 00:24:04