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'))
改动说明
- 端口复用配置:
setsockopt添加的SO_REUSEADDR参数允许端口在TIME_WAIT状态下被重新绑定,不需要等待2MSL超时时间 - 外层监听循环:将
accept()放入死循环中,单个连接断开后会自动回到监听状态,等待下一个客户端接入 - 断开检测逻辑:新增
if not data判断,检测到客户端断开后主动退出当前连接的处理循环,避免无限打印空内容
修改完成后,每次执行nc 192.168.8.21 12345 < data.txt发送完数据断开连接后,服务端会自动恢复监听状态,无需重启脚本即可接收下一次连接。如果需要同时处理多个并行连接,可以进一步引入多线程/异步IO逻辑。
内容的提问来源于stack exchange,提问作者HugoSab
相关产品推荐
相关产品推荐

