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

为何socket.accept()会导致已建立的未处理连接中断?

关于socket.accept()的连接维持问题

背景

我搜索了大量帖子但未找到答案。我理解socket.accept()实际是从完全连接队列中获取套接字,也知道由于阻塞IO,必须依赖并发处理多连接。

但我的问题是:socket.accept()还会执行哪些操作?它会中断已建立的连接吗?在我的实验中,我用一个线程接受新连接但不对其做任何处理——故意不调用recv(),想维持多个连接。

实验代码与现象

服务器端(Linux服务器)

import time
import socket

HOST = "0.0.0.0"  
PORT = 65432 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen()

while True:
    conn, addr = s.accept()

客户端(MacBook)

import socket

HOST = "192.168.0.104"
PORT = 65432


s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
while True:
    print('connect')
    s.send(b"Hello, world")

实验现象

启动服务器后,第一个客户端被阻塞;启动第二个客户端时,第一个客户端报错退出:

Traceback (most recent call last):
  File "/Users/home/xxx/test-client.py", line 14, in <module>
    s.send(b"Hello, world")
BrokenPipeError: [Errno 32] Broken pipe

而第二个客户端被阻塞。

疑问

  • 我期望服务器能维持多个连接,为何只有一个能持续?
  • 如果socket.accept()总会中断已建立连接,为何并发能正常工作?

问题解决

正如@Mark Tolonen的回答,原因是垃圾回收。使用以下代码片段后,我能维持多个连接:

#!/usr/bin/env python3
import time
import socket

HOST = "0.0.0.0"  
PORT = 65432 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen()

connections = []
while True:
    conn, addr = s.accept()
    connections.append(conn)

吐槽

感谢各位的帮助,我想在此吐槽当前Stack Overflow的氛围。提问前我花了几天研究套接字并查阅相关问题,对某些人来说这可能很基础,但我实在不理解为何有人认为这是个糟糕的问题。对他人而言再基础的问题,对提问者来说都可能很难,唯有学习才能成长,也能帮助遇到相同问题的人。愿Stack Overflow保持开放。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 04:31:10